前言

StringBufferStringBuilder虽然经常用,但偶尔忘记他们之间的区别,这里简单整(摘)理(抄)一下,方便自己查阅。

PS:好记性不如烂笔头

正文

StringBuffer 和 StringBuilder都是可变的字符串,但他们两之前还是有不少的区别。

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 适合 : 单线程

参考文章

  1. StringBuffer 和 StringBuilder 的 3 个区别

相关文章

暂无评论

none
暂无评论...