StringBuffer和StringBuilder的差别
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
共同点:都继承了AbstractStringBuilder抽象类,实现了CharSequence接口。StringBuffer从JDK1.0就有,StringBuilder从JDK1.5才出现。 初始容量都是16和扩容机制都是旧容量*2+2 ,底层都是采用char[]的字符数组。
public StringBuffer(){
super(16);
}
public StringBuilder(){
super(16);
}
区别:StringBuffer是线程安全的,因为它方法中都用synchronized修饰,加锁。但同时效率也低。
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuffer中有一个toStringCache的字符数组,主要是为了toString的时候提高性能。假如toStringCache不为null,那么就会直接把String对象中的value=toStringCache而StringBuilder会调用System.arraycopy先复制一个数组进行然后在复值给value。
适用场景
-
StringBuffer多线程下是安全的,但是synchronized,其效率低。适用于多线程下,并发量不高的情景。
-
StringBuilder没有任何锁,效率高,适用于单线程场景,但同时也适应于高并发场景,提高相应性能,线程安全可以通过其他手段进行解决。
String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence{
}
实现了 CharSequence 接口,表示是一个有序字符的集合。