java . lang . StringBuffer 与 java . lang . StringBuilder 代表可变的字符序列,分别在 JDK 1.0 与 JDK 1.5 中声明,可以对字符串内容进行增删,此时不会产生新的对象
目录
String、StringBuffer、StringBuilder的不同之处
String、StringBuffer、StringBuilder的源码分析
StringBuffer与StringBuilder源码分析
String、StringBuffer、StringBuilder的不同之处
String:不可变的字符序列,底层使用 char[ ] 存储
StringBuffer:可变的字符序列,线程安全,效率相比 StringBuilder 较低,底层使用 char[ ] 存储
StringBuilder:可变的字符序列,线程不安全,效率相比 StringBuffer 较高,底层使用 char[ ] 存储
public class MyTest {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("abc");
s1.append('1'); //StringBuffer 与 StringBuilder 都是可变的
System.out.println(s1);
}
}
>>> abc1
三者的效率从高到低为:StringBuilder > StringBuffer > String
String、StringBuffer、StringBuilder的源码分析
String的源码分析
因为 final,所以不可变性
String str = new String();
// 相当于 char[] value = new char[0];
StringBuffer与StringBuilder源码分析
因为 StringBuffer 与 StringBuilder 的源码相似,我们这里就分析 StringBuffer
StringBuffer sb1 = new StringBuffer();
//相当于char[] value = new char[16];
//在底层创建了一个长度为16的数组
如果 StringBuffer sb2 = new StringBuffer("abc"); 打印 sb2 . length,其长度为 3,不是 16
扩容问题:如果要添加的数据底层数组盛不下,那就需要扩容底层数组。默认情况下,扩容为原来容量的 2 倍 + 2,同时将原有数组中的元素复制到新的数组中