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