Java StringBuffer和StringBuilder源碼閱讀

StringBufferStringBuilder的類關係圖如下,可以看出,兩者都繼承了序列化接口Serializable,都實現了抽象類AbstractStringBuilder

mark

mark

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源碼分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章