ArrayList扩容简单理解
***ArrayList提供了三种构造方法L:
每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。
数组扩容通过一个公开的方法ensureCapacity(int minCapacity)来实现。在实际添加大量元素前,我们也可以使用ensureCapacity来手动增加ArrayList实例的容量,以减少递增式再分配的数量。
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);
}
ArrayList每次扩容后都会将新的容量和需要的容量进行比较,如果经过1.5倍扩容后能够满足需求则结束扩容,否则会继续以上次扩容后的容量(也就是没有满足需求的容量)为基础继续1.5倍扩容;
例如:初始容量为10,而你添加的数量为11,则第一次扩容后的15可以满足,如果你添加的为16,则第一次的15无法满足,第二次就会在15的基础上进行操作,变成22,知道可以满足需求为止。
如果我们能够根据需求对 minCapacity进行赋值,第一次就会以我们给的值进行1.5倍扩容;
例如:list.ensureCapacity(15); 这时候在添加16个数据,他就会变成15*1.5变成22的容量,可以减少扩容时的比较次数。