為什么 new ArrayList 的時候最好指定長度呢?
new ArrayList<>(20);
- 添加元素add(E e) 源碼
public boolean add(E e) {
//檢測是否要擴容 參數(shù)是 當前數(shù)組長度 + 1
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
- 再探擴容函數(shù)
//擴容方法
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//計算出一個值A(chǔ)、這個值呢用來和原數(shù)組長度比較、
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
//用A來和源數(shù)據(jù)長度做比較,如果 > 原數(shù)據(jù)長度 則要擴容
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
當調(diào)用ensureCapacityInternal(size + 1)的時候,Debug看下、

-
再看grow(minCopacity)函數(shù)

-
所以說初始化數(shù)組的時候盡可能的賦值長度,減少內(nèi)存的申請和釋放操作!