为什么 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)
函数
所以说初始化数组的时候尽可能的赋值长度,减少内存的申请和释放操作!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。