为什么 new ArrayList 的时候最好指定长度呢?
new ArrayList<>(20);
- 添加元素add(E e) 源码
public boolean add(E e) {
//检测是否要扩容 参数是 当前数组长度 + 1
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
- 再探扩容函数
//扩容方法
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//计算出一个值A、这个值呢用来和原数组长度比较、
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
//用A来和源数据长度做比较,如果 > 原数据长度 则要扩容
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
当调用ensureCapacityInternal(size + 1)
的时候,Debug看下、
-
再看grow(minCopacity)
函数
-
所以说初始化数组的时候尽可能的赋值长度,减少内存的申请和释放操作!