StringBuffer的解讀(一)

對於StringBuffer的解讀

所有的源代碼都是jdk1.8.0_202。

  • append(String str)方法的實現,代碼如下:
@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);//直接調用父類的append方法。
    return this;
}

其中調用了其父類AbstractStringBuilderde的append(String str)這個方法,代碼如下:

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

其中appendNull方法,代碼如下:

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = 'n';
    value[c++] = 'u';
    value[c++] = 'l';
    value[c++] = 'l';
    count = c;
    return this;
}

其中ensureCapacityInternal方法,代碼如下:

private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0) {
        value = Arrays.copyOf(value,
                newCapacity(minimumCapacity));
    }
}

其中newCapacity方法,代碼如下:

private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int newCapacity = (value.length << 1) + 2;
    if (newCapacity - minCapacity < 0) {
        newCapacity = minCapacity;
    }
    return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
        ? hugeCapacity(minCapacity)
        : newCapacity;
}

我們再看看hugeCapacity是搞什麼的,代碼如下:

private int hugeCapacity(int minCapacity) {
    if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
        throw new OutOfMemoryError();
    }
    return (minCapacity > MAX_ARRAY_SIZE)
        ? minCapacity : MAX_ARRAY_SIZE;
}

代碼差不多了,總結一下:

  1. append方法大部分實現是在AbstractStringBuilder中
  2. 如果append的是null,直接將null這4個字符加在後面
  3. 如果不是null,原本剩餘容量能接納新的String,調用String.getChars()方法將新的字符串加進去,裏面各種邊界檢查之後,調用的是System.arraycopy()方法,這是一個native的方法,依賴於底層的實現。
  4. 原本容量不夠,好的,容量double之後+2,還不夠嗎?好的,就用你給的參數值(就是原本字符數量+需要加進去的字符數量)。再通過Arrays.copyOf()方法,先複製原先的字符,最後回append方法中,走第3步中String.getChars()方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章