StringBuffer
和StringBuilder
的類關係圖如下,可以看出,兩者都繼承了序列化接口Serializable
,都實現了抽象類AbstractStringBuilder
。
StringBuffer和StringBuilder的源碼幾乎相同,而且方法大都調用了父類AbstractStringBuilder的方法,不同之處就在於StringBuffer多了一個變量toStringCache,並且所有方法都加了鎖。由此可見,StringBuffer是線程安全的。
transient標記該變量不參與序列化。
private transient char[] toStringCache;
toStringCache變量緩存toString方法最後一個返回的字符串。toString方法中,將value複製給了toStringCache。
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
在方法setLength和其他改變字符串的方法中,首先將toStringCache置爲null。
@Override
public synchronized void setLength(int newLength) {
toStringCache = null;
super.setLength(newLength);
}
爲什麼要給toString方法一個緩存呢?應該是爲了提高效率吧。
AbstractStringBuilder源碼參考AbstractStringBuilder源碼分析