StringBuffer和StringBuilder它们都是可变的字符串,不过面试出现几率极高;
今天带大家一起了解一下叭,为面试做足准备;
先看一下StringBuffer和StringBuilder的类结构叭:
看类图就是继承一个抽象的字符串父类AbstracStringBuilder;
区别一:线程安全
StringBuffer:线程安全,StringBuilder:线程不安全。因为StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder并没有synchronized;
StringBuffer代码段:
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
区别二:缓冲区
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()方法仍然是同步的;
区别三:性能
既然StringBuffer是线程安全的,他的所有公开方法都是同步的,StringBuilder是没有对方法加锁同步的,所以StringBuilder的性能要远大于StringBuffer,实锤了;
总结:
So,StringBuffer适用于在多线程操作同一个StringBuffer的场景,如果是单线程场合StringBuilder则更适合;
虽然知识很底层,但是开发者必读。好家伙