StringBuilder与StringBuffer的一点笔记
toStringCache
private transient char[] toStringCache;
这是StringBuffer中的一个成员变量,transient代表着它不可被序列化,"Cache"则可以看出它是用来作缓存的。
toString()
toStringCache = null;
可以在很多对字符串进行操作的方法中看到这句代码,将缓存重置, 而只有在toString()中:
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
可以看到使用了这个缓存,因此StringBuffer是使用了缓存的,而StringBuilder则没有相应内容。
append(String str)
此外除开synchronize之外还有一点小发现:
两者均extends AbstractStringBuilder,都是AbstractStringBuilder的子类,它们在执行append() 时的唯一区别就是Buffer先进行了清空缓存的操作。
StringBuffer:
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
StringBuilder:
public StringBuilder append(String str) {
super.append(str);
return this;
}