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()进行拼接,最后设置当前数据长度



 

posted @ 2019-01-08 01:36  一生一念  阅读(139)  评论(0)    收藏  举报