一、分类【按字符串可否被修改这一条件】
String属于一类,特点是字符串长度一旦给定就不允许修改。为什么不允许修改?因为String类型的数据是被存储在private final char value[]这个数组里的,value数组的修饰符决定了其不可修改的特性。String类的源码如下:
StringBuffer和StringBuilder属于另一类,特点是StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。字符串保存在value这个char类型的数组中
从继承关系图中可以看到,StringBuffer和StringBuilder均继承自AbstractStringBuilder,所以自然就继承父类的属性char【】 value
二、扩容机制
StringBuffer在调用StringBuffer() 这个无参构造器进行创建时,初始容量为16个字符;
StringBuffer在进行字符串append添加的时候,会先计算添加后字符串大小,调用父类AbstractStringBuilder中的方法:ensureCapacityInternal 判断是否进行扩容
需要扩容就调用父类AbstractStringBuilder中的expandCapacity方法进行扩容:
新容量扩为原来大小的 2倍+2
三、应用场景
1.String:很少修改的数据,效率低,但是复用率高。
注:
(1)很少修改的数据:比如说配置信息
(2)啥是复用率高?举个栗子:
String str = “helllo”;
String str1 = “helllo”;
String str2 = “helllo”;
以上三句执行后,str、str1和str2这三个变量所指向的hello是同一个存储再常量池里的hello,并不会额外创建新的hello;
2.StringBuffer:适用于经常进行增删,要求线程安全的场景,效率较高
3.StringBuider:适用于经常进行增删,追求效率,但对线程安全要求不高的场景
四、总结