1.String
String的底层是字符数组,由于字符数组被final修饰,所以String的长度是不可变的,并且String不可被更改,不可被继承,是线程安全的
private final char value[];
2.StirngBuffer
StringBuffer继承自AbstractStringBuilder,在 AbstractStringBuilder 中也是使用字符数组保存字符串的, 但是字符数组没有被 final 关键字修饰,所以StirngBuffer长度是可变的
由于StringBuffer的append方法被synchronized修饰,所以StringBuffer是线程安全的
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
3.StringBuilder
StringBuilder也是继承自AbstractStringBuilder,所以StringBuilder长度也是可变的。
由于StringBuilder的append方法没有被synchronized修饰,所以StringBuilder不是线程安全的
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
注意:StringBuffer线程安全,StringBuilder线程不安全,别搞反了
在效率方面:因为StringBuffer很多方法都被synchronized修饰,同时刻只能有一个线程去执行一个方法,所以效率会比StringBuilder低一些
总结:
1.可变性: String长度不可变,StringBuffer和StringBuilder长度可变
2.安全性: String线程安全,StringBuffer线程安全,StringBuilder线程不安全
3.效率:StringBuffer效率低于StringBuilder