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