對于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;
}
代碼差不多了,總結一下:
- append方法大部分實作是在AbstractStringBuilder中
- 如果append的是null,直接将null這4個字元加在後面
- 如果不是null,原本剩餘容量能接納新的String,調用String.getChars()方法将新的字元串加進去,裡面各種邊界檢查之後,調用的是System.arraycopy()方法,這是一個native的方法,依賴于底層的實作。
- 原本容量不夠,好的,容量double之後+2,還不夠嗎?好的,就用你給的參數值(就是原本字元數量+需要加進去的字元數量)。再通過Arrays.copyOf()方法,先複制原先的字元,最後回append方法中,走第3步中String.getChars()方法。