StringBuffer和StringBuilder
1.类图比较
可以看到二者的基本方法一直,但StringBuffer在写操作和继承父类操作重写时加入了synchronized关键字,所以StringBuffer是线程安全的,StringBuilder是线程不安全的。也就是说,单线程操作,推荐用StringBuilder,多线程操作推荐用StringBuffer。
2.StringBuffer和StringBuilder可加性实现分析
源代码:
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
...
public StringBuffer() {
super(16);}
public StringBuffer(int capacity) {
super(capacity);}
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);}
}
可以看到当字符串长度大于默认的16时,会调用append方法,将其追加到已有字符串后边
append方法在父类中的实现:
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);//count初始化的值为0
str.getChars(0, len, value, count);
count += len;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity)); //value的初始值为
}
}
当minimumCapacity - value.length > 0时,对value进行扩容,将其扩展为minimumCapacity大小。然后在str.getChars方法中进行复制,将str(String类型)的从0到len复制给value(char[])。