String不可变字符序列,底层的char型的数组,JDK1.9之后改为byte型的数组。
StringBuffer可变的字符序列,线程安全。
StringBuilder可变字符序列,线程不安全,所以效率较StringBuffer高。
为什么JDK1.9中String采用byte[]进行储存.
StringBuffer和StringBuilder都继承于AbstractStringBuilder类,都实现了Serializable, Comparable, CharSequence接口,里面方法相同,不过StringBuffer中的方法实现了线程安全。
StringBuffer和StringBuilder最开始new的时候长度为16,若后面长度超过16就会扩容,扩容长度为原长度的两倍再加上2,并复制到原数组中。
扩容具体源码如下:
private int newCapacity(int minCapacity) {
int oldCapacity = this.value.length >> this.coder;
int newCapacity = (oldCapacity << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
开发中建议用 StringBuffer(int capacity) 自定义数组长度,可避免数组扩容,造成不必要的资源浪费。
StringBuffer,StringBuilder赋值使用append函数