擴容
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
// 這里就是獲取在當前容量的基礎上的最小擴容數(shù),size+1
private static int calculateCapacity(Object[] elementData, int minCapacity) {
// 如果當前鏈表為空乡洼,則從傳入和默認中選一個最大的牡借,作為初始的容量大小
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
// 記錄鏈表有變更寨昙,fast-fail
modCount++;
// 如果大于數(shù)組大小紧索,說明需要新的一輪擴容淤袜。
// 比如踱讨,初始大小是10峭梳,現(xiàn)在minCap是2碾篡,那么這里進不來就不需要
// 否則虱而,如果是11,那么就需要擴容了
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// 先拿到老的容量
int oldCapacity = elementData.length;
// 計算新的容量 = Old * 1.5
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果上面計算完的新的容量還比最小容量值小开泽,那么用minCap
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果超出閾值
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 給elementData擴容到newCapacity
elementData = Arrays.copyOf(elementData, newCapacity);
}