StringBuffer 和StringBuilder的区别
区别1,线程安全
StringBuffer是线程安全的,StringBuilder不是线程安全的。因为StringBuffer所有的公开方法,都是由Serializable修饰的,但是StringBuffer中却没有stringBuffer的修饰
Stringbuffer代码片段
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
区别2,缓冲区
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有用到toStringCache缓冲区的值去构建一个字符串。
而stringBuilder每次都要复制一个字符串数组,再构造一个字符串。
区别3,性能
StringBuffer是线程安全的,它所有的公开方法都是同步的,而stringBuilder是没有加锁同步的,所以它的效率要比StringBuffer更高一些,性能更好些。
总结
多线程场景更适合用StringBuffer 单线程的场景使用stringBuilder更好一些。