Java StringBuffer擴容問題

看下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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章