package com.ydlclass.StringBuilder;

import java.util.Random;

public class StringBuilderTest {
    public static void main(String[] args) {
        //可变字符序列APi,不同于String类,String,以及其中的一个char数组都是被final所修饰的,所以不能被改变
        //StringBuilder 和StringBuffer是相同的,前者是线程不安全的,后者是线程安全的,那么这两个的大不同主要是在于,前者虽线程不安全但是效率很高,反之。
        StringBuilder stringBuilder = new StringBuilder();//默认可以发现这个容量已经被传入了一个长度,长度为16,可以查看源码来实现。
        StringBuilder append = stringBuilder.append(1);
        System.out.println(append.toString());
        StringBuilder adad = stringBuilder.append("1").append("0.2").append("adad");
        System.out.println(adad);//实现字符串以及其他类型的之间的拼接
        //这个类中常见的方法主要可以通过直接获取源码来实现相关方法的调用。其中没能发现数组,那么我们可以去它的父类中去寻找。
        //这时的char数组已经修改为可byte数组来实现了它是可以有权限的,jdk9之后char数组转变为了byte数组了。所以StringBuilder就可以实现数组扩容
        System.out.println("------------");

        StringBuilder java = adad.insert(2, "java");//插入的方法

        System.out.println(java);
        System.out.println(java.reverse());//注意这个操作是直接发生在本身上的,所以修改之后的内容不同于之前的
        System.out.println(java);
        System.out.println(java.lastIndexOf("j"));//如果返回的是一个正数,那么则表示为查找到的一个下标的位置
        //如果没有找到,则返回-1
        //这个方法返回的是this


        StringBuilder stringBuilder1 = new StringBuilder();//使用append方法时,如果发现长度不够时就会自动的惊醒数组的扩容
        //由于byte数组不是StringBuilder这个类下面的,而是其父类AbstractStringBuilder下面的一个属性的值,所以也是由父类完成
        //字符数组的一个扩容问题

        System.out.println("测试两者的性能效率");


        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            stringBuilder1.append("a");
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);

        StringBuffer stringBuffer = new StringBuffer();
        long start2 = System.currentTimeMillis();

        for (int i = 0; i < 1000; i++) {
            stringBuffer.append("a");
        }
        long end2 = System.currentTimeMillis();
        System.out.println(end2 - start2);//两者之间的性能,当规模越大时,之间的差距也就越大

        String string = new String();
        long start3 = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            string += "a";//这时可能会长时间的等待,而出不来,这是应为String在进行字符串的拼接时,由于byte数组是被final所修饰的
            //字符串的拼接需要大量的创建对象,导致效率十分低下

        }
        long end3 = System.currentTimeMillis();
        System.out.println(end3 - start3);

        //总结:需要进行字符串的拼接时,我们需要使用stringbuilder,或者是Stringbuffer来完成,考虑是否需要线程安全来选择他们其中的一种
        //String这个类是不能用于拼接操作,否则可能导致内存溢出问题

        //在百万次拼接下,Stringbuilder与StringBuffer所耗费的时间大致为20毫秒,String大致花费了71秒的时间才完成;十万以内分别所花费的时间为(10,0,1010毫秒)
        //一万以内的花费时间分别为(0,0,70毫秒)

        


        //
    }
}