前言
StringBuffer和StringBuilder虽然经常用,但偶尔忘记他们之间的区别,这里简单整(摘)理(抄)一下,方便自己查阅。
PS:好记性不如烂笔头
正文
StringBuffer 和 StringBuilder都是可变的字符串,但他们两之前还是有不少的区别。
StringBuffer和StringBuilder的类结构
从上面可以看出,他们都继承AbstractStringBuilder,当具体使用起来就存在区别了。
StringBuffer和StringBuilder的区别
StringBuffer和StringBuilder存在如下几个区别:
1. 线程安全
StringBuffer 是线程安全的,其的方法中有synchronized 修饰。
StringBuilder 是线程不安全的。
因此,在安全方面,StringBuilder优秀。
2. 性能
接上面线程安全和线程不安全,由于带有锁(synchronized修饰),导致访问的方法都同步的,也就存在访问一个方法另一个方法就需要等着。
因此,在性能上,StringBuffer比StringBuilder差。
3. 缓冲区
StringBuffer 代码片段:
private transient char[] toStringCache;
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder 代码片段:
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
可以看出,StringBuffer每次获取toString都会直接使用缓存区的toStringCache值来构造一个字符串。
而StringBuilder则每次都需要复制一次字符数组,会再创建一个字符串。
缓存冲是对StringBuffer的一个优化,但StringBuffer的toString是有Synchronized修饰。
因此,StringBuffer和StringBuilder各打五十大板。
总结
如果整理来看,StringBuilder和StringBuffer各有优缺点,也就各打五十大板。
如果我们在不同场合使用不同的,就可以发挥其的优点。
适合的场合
StringBuffer 适合 : 多线程
StringBuilder 适合 : 单线程
参考文章