ArrayList初始化以及扩容机制
网上很多关于ArryList集合的说法,很多说法是错误的,自己详细记录一下
1.ArryList的初始化长度
首先查看源码部分
这是ArrayList 的构造方法,很明显,在初始化的时候,如果不传入参数的话,就是一个空数组,所以他初始化长度是 0!!!
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
2.关于ArrayList的扩容机制
2.1 add()方法
源码上看,第一 ArryList 首次扩容会扩大10 的长度
接下来看重点代码,最后总结出来,除了首次扩容是10,其次都是上次的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
oldCapacity 之前的长度,那么这个计算公式就是 当前长度= 上次的长度+(上次长度除以2)) ,也就是 原长度的1.5
private static final int DEFAULT_CAPACITY = 10;
1.添加
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } 2.调用 private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } 3.首次条件是否扩容 private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; }
4.不是首次扩容
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
2.2 addAll()方法
addAll的源码就不上了,直接说了,addAll 扩容是根据就近原则,选择最大值扩容
1.第一次扩容小于10 ,那么直接扩容为10
2.第一次扩容大于10.小于1.5 ,长度就是当前的集合长度
3.二次扩容的时候 小于1.5 ,扩容其1.5倍
4.二次扩容大于 1.5 长度就是当前集合长度