1、数据可变和不可变
String
底层使用一个不可变的字符数组private final char value[];
所以它内容不可变。StringBuffer
和StringBuilder
都继承了AbstractStringBuilder
底层使用的是可变字符数组:char[] value;
2、线程安全
StringBuilder
是线程不安全的,效率较高;而StringBuffer
是线程安全的,效率较低。
通过他们的append()
方法来看,StringBuffer
是有同步锁,而StringBuilder
没有:
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
3、 相同点
StringBuilder
与StringBuffer
有公共父类AbstractStringBuilder
。
最后,操作可变字符串速度:StringBuilder > StringBuffer > String
,这个答案就显得不足为奇了。