String:final修饰类不能被继承,声明变量是不可变的,如果需要改变需要更改引用变量的地址,字符串拼接时需要更改引用地址浪费空间效率低。
StringBuilder:可变字符串,底层采用char[]来存储,数组初始长度count = 构造方法参数长度 + 16,append如果长度不够会触发扩容机制:新长度为2 * 当前数组长度 + 2,如果newCapacity 长度小于append参数长度 + 原数组长度则以append参数长度为准进行数组扩容,然后进行数组拷贝返回结果。
int newCapacity = (value.length << 1) + 2;//2 * value.length + 2
if (newCapacity - minCapacity < 0) {//minCapacity = append参数长度 + 当前数组长度
newCapacity = minCapacity;
}
StringBuffer:与StringBuilder相比是线程安全的因为对齐操作的方法都加上了synchronized关键字,扩容方式与StringBuilder方法一样,因为都继承了AbstractStringBuilder方法,与StirngBuilder相比相率较低。
理解之上,写出想要说的话!
以上仅为个人拙见,写出来加深记忆,错误之处欢迎大神指正!