前言
JDK 8
String为不可变,StringBuilder、StringBuffer都为可变。
为什么String是不可变的?
// final修饰,禁止继承String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
// final修饰数组,初始化后无法再次赋值
private final char value[];
...
}
StringBuilder、StringBuffer
两者都继承于AbstractStringBuilder
其中StringBuffer为线程安全,append操作会进行同步
// 用于缓存每次toString的值,当value被修改时置为null
private transient char[] toStringCache;
@Override
synchronized StringBuffer append(AbstractStringBuilder asb) {
toStringCache = null;
super.append(asb);
return this;
}