1.String
1) 成员变量有final类型的char数组,代表其是不可变的。
2) 线程安全与否就不用讨论了,都不可修改了。
3) 一般b=b+b; 其实b不是被修改了,而是生成了新的String对象。
/** The value is used for character storage. */
private final char value[];
2.StringBuilder
1) 继承的 AbstractStringBuilder类中,有成员变量char[]数组,可以对其增删改查。
2) 线程不安全的
* The value is used for character storage.
*/
char[] value;
3.StringBuffer
1)继承的 AbstractStringBuilder类中,有成员变量char[]数组,可以对其增删改查。同时,有一个缓存用的char数组toStringCache.用来记录toString()后的结果。如果后续修改就会变null。
2)是线程安全的。基本上所有的修改相关方法都用synchronized修饰,如下:
@Override
public synchronized StringBuffer append(char c) {
toStringCache = null;
super.append(c);
return this;
}
@Override
public synchronized StringBuffer append(int i) {
toStringCache = null;
super.append(i);
return this;
}