相同点:都与字符串操作相关(都实现implements CharSequence),底层都是char [ ] 存放数据的。
String:不可变字符序列;
StringBuffer:可变字符序列;线程安全的,效率低;
StringBuilder:可变字符序列;线程不安全的,效率高(jdk5.0新增);
String的不可变性表现为:①在现在字符串后增加字符串,在常量池中重新创建新的字符串。
②修改现有字符串,在常量池中重新传建新的字符串。
String str = new String("abc"); // new char [ ] {'a','b','c'}.定长的数组。
String 源码:
String的不可变性原因:底层代码中定义的 char [ ] 数组是用 final修饰的。
StringBuffer/StringBuilder可变原因是:二者均继承(extends )AbstractStringBuilder,AbstractStringBuilder定义的char [ ] 无修饰符。
StringBuffer sb1 = new StringBuffer ( ); // new char [16 ] 默认调用父类的有参构造,参数是16
sb1.length(); //0
sb1.append("a"); // char[0] = 'a'
sb1.append("b"); // char[0] = 'b'
.......
有可能超出底层数据的范围:涉及扩容的问题(在AbstractStringBuilder中实现)。容量到不够的时候才去扩容。
默认int newCapacity = value.length * 2 + 2;
扩容完数据复制:value = Arrays.copyOf(value, newCapacity);
开发建议:在已知字符串长度时,定义直接指定数组长度。
源码部分展示:
AbstractStringBuilder
StringBuilder
StringBuffer