看下StringBuffer的2個構造器和append()方法:
1、無參構造器,順便看下父類方法,new()了一個長度爲16的數組----由此可見,無參夠造器默認容量是16
public StringBuffer() {
super(16);
}
// super()方法調用父類
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
2、有參構造器,參數是String類型的,順便看下父類,new()了一個長度爲str.length+16的數組----由此可見,有參構造函數,初始化的容量是(str.length+16)
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
// 同樣super()調用父類
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
3、當我們調用append()方法的時候,一直向上找到父類的expandCapacity()方法
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
可以看出,當我們append的時候,如果當前容量夠用,則不擴容,如果當前容量不夠用了,則需要擴容,擴容的機制是,①當前容量 * 2 +2 , ②見下面第二個測試的解釋
解釋:
19 = 16 + 3 默認容量 16 ,"123"的長度3
16 默認容量
16 當前容量16夠用,不需要擴容
34 = 16 * 2 + 2 當前容量不夠用了,需要擴容
70 = 34* 2 + 2 當前容量不夠用了,需要擴容
142 = 70* 2 + 2 當前容量不夠用了,需要擴容
特殊情況,解釋:
16 默認的容量
40 = sb2.length 這裏需要注意下,如果這個時候 原容量 *2 + 2 < sb2.length ,會把當前容量設置成sb2.length,參見父類方法裏的 ( if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity;) 這個地方
82 = 40 * 2 + 2
166 = 82 *2 + 2