1.对比:String、StringBuffer、StringBuilder
- String(JDK1.0):不可变字符序列
- StringBuffer(JDK1.0):可变字符序列、线程安全、效率低
- StringBuilder(JDK5.0):可变字符序列、线程不安全、效率高
如果要频繁的修改数据,应使用 StringBuilder或 StringBuffer;因为String的效率比较差,每次改变值都会产生一个新的对象.
StringBuilder 和 StringBuffer 非常相似,均代表可变的字符串序列,而且提供相关功能的方法也一样。他们都是 AbstractStringBuilder类的子类,并且重写了相关方法,并在这些方法中显示的调用父类的方法,而StringBuffer的大多方法使用 synchronized作同步处理,因此是线程安全的,但也因此效率相对 StringBuilder较低。
StringBuilder:
public StringBuilder reverse() {
super.reverse();
return this;
}
StringBuffer:
public synchronized StringBuffer reverse() {
toStringCache = null;
super.reverse();
return this;
}
2.StringBuffer源码分析
空参数构造方法初始 char[]容量为 16:
public StringBuffer() {
super(16);
}
有参数构造方法初始 char[]容量为 length + 16:
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
若要添加的数据底层数组已经满了,就会进行扩容,默认情况下:扩容为原来的2倍 + 2,同时复制原来的数组元素到新的数组中
有一种指定容量的构造方法,使用此方法可以在需要对原有的 16容量进行扩容的的情况下提高效率:
StringBuffer(int capacity) 或 StringBuilder(int capaciry)
String str1 = new String(); // new char[0];
String str2 = new String("abc"); // new char[]{'a','b','c'};
StringBuffer buffer1 = new StringBuffer(); // new char[16];
buffer1.append('a'); // value[0] = 'a';
buffer1.append('b'); // value[1] = 'b';
StringBuffer buffer2 = new StringBuffer("abc"); // new char["abc".length + 16];