从以下三点来阐述String、StringBuffer和StringBuilder
1.数据的可变性与不可变性
1)String是不可变得,因为它底层使用了一个不可变的数组private final char value[];所以它的内容是不可变得,我们平常看似改变了String的值其实只不过是改变了其引用,是将其引用指向不同的对象而已。
2)StringBuffer和StringBuilder都继承了AbstractStringBuilder,底层使用的是可变的字符数组char[] value;
2.线程的安全性
1)StringBuilder是线程不安全的,StringBuffer是线程安全的。StringBuilder比StringBuffer效率高。
StringBuffer的append方法使用了同步锁(synchronized);StringBuilder则没有。
以下是他们append方法代码:
@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.相同点
StringBuffer与StringBuilder都继承自AbstractStringBuilder。
String、StringBuffer和StringBuilder三者操作可变字符串速度快到慢依次是:StringBuilder > StringBuffer > String