String、StringBuffer、StringBuilder的区别
这里指的是jdk1.8源码
String 是不可变的
底层字符数组也是被final修饰,所以每次调用写的方法都会重新生成一个新的字符串
StringBuffer和StringBuilder 底层字符数组没有被final修饰,所以是可变的
String用“+”拼接时,通过反编译可以知道,其实也是生成了一个StringBuilder进行append,最后toString
所以如果是循环或者是拼接大量的字符串,单线程时可以采用StringBuilder,多线程采用StringBuffer
线程安全:
String因为是不可变的,所以它是线程安全的
StringBuffer因为写都有同步关键字,所以他也是线程安全的
StringBuilder不是线程安全的
StringBuffer和StringBuilder都继承于AbstractStringBuilder抽象类
初始化:
StringBuffer和StringBuilder无参构造方法,会创建一个16长度的字符数组
StringBuffer和StringBuilder有参构造方法,会创建一个字符串长度+16长度的字符数组,然后调用append进行拼接
StringBuffer和StringBuilder在拼接的时候会调用父类AbstractStringBuilder.append方法,区别在于StringBuffer会有同步关键字,而StringBuilder没有

如果为空,会返回一个null;

然后执行ensureCapacityInternal方法进行扩容,参数是当前字符数组长度加上当前传进来的参数长度
上述方法进去后参数的长度是否大于数组长度,大于的情况下则获取扩容长度
获取扩容长度方法名newCapacity,扩容默认是当前数组长度*2+2,
然后判断扩容后的长度和当前参数长度比较是否大于,小于的情况则扩容成当前参数长度
最后通过Arrays.copyOf方法进行扩容,参数为当前数组和最新的扩容后的长度(根据最新的长度创建了一个新的char数组)
str.getChars()进行拼接,最后设置当前数据长度

浙公网安备 33010602011771号