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;
}
StringBuilder与StringBuffer的性能与缓存机制

这篇博客探讨了StringBuffer和StringBuilder的区别,尤其是它们在缓存策略上的差异。StringBuffer使用了toStringCache来优化性能,每次字符串操作后会清空缓存,而在调用toString()时利用缓存提高效率。StringBuilder则没有类似的缓存机制。此外,两者都继承自AbstractStringBuilder,但append()方法实现上,StringBuffer会在操作前清空缓存,StringBuilder则没有此步骤。
1068

被折叠的 条评论
为什么被折叠?



