StringBuilder 和 StringBuffer在面试和工作中,经常被使用和问道。今天也总结下2者的区别和用法。

1.StringBuilder不是线程安全的,StringBuffer是线程安全的。代码为证:

//StringBuilder的append实现

public StringBuilder append(String str) {
    super.append(str);
    return this;
}
//StringBuffer的append实现
public synchronized StringBuffer append(Object obj) {
    super.append(String.valueOf(obj));
    return this;
}

父类AbstractStringBuilder总append的实现
public AbstractStringBuilder append(String str) {
    if (str == null) str = "null";
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

从上面的例子可以看到 StringBuilder的append操作是通过父类来实现的,很显然会有线程安全问题(多个线程操作同一个char[]);StringBuffer 的append的操作本身是同步的(所有会改变改变底层char[]的操作都是线程安全的)。


2.效率问题

        很显然在单线程环境下StringBuilder的性能也要比 StringBuffer好,因为它不要获取锁,但是二者的性能差距不会很大,因为没有锁竞争。在多线程环境下不具有比较性。二者底层char[]的操作都一样。


3.使用场景比较

StringBuilder:就只能在单线程环境下使用,我们平时也是在一个方法总创建StringBuilder对象并操作的。

StringBuffer :在多线程环境下使用,单线程环境就不要用了。一般很少有场景需要多线程操作字符串的。


欢迎大家补充。