為什么 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挺庞、這個值呢用來和原數(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)存的申請和釋放操作!