public StringBuilder() { //默認的容量是 16
super(16);
}
public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); //count 表示當前stringbuilder 對象的長度 len 表示要添加對象的長度 str.getChars(0, len, value, count); count += len; return this; }
private void ensureCapacityInternal(int minimumCapacity) { //用來判斷添加進來的對象加上原來的對象長度 是否大於value.length() 剛開始是16
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
private int newCapacity(int minCapacity) { //如果大於的話 就增加容量 (value.lenght << 1 ) + 2 左移一位 相當於乘以2 得到 34
// overflow-conscious code
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) { //如果34 小於 最小的容量(添加進來的對象加上原來的對象長度) 那么新的容量就是最小的容量
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
總結: stringBuilder 擴容的時候,容量不一定是 16*2 + 2