ArrayList扩容机制ensureCapacityInternal方法判断是否要扩容首先获取数组的旧容量,然后计算新容量的值,计算使用位运算,将其扩容至原来的1.5倍。默认容量是10,得到新容量的值后,校验扩容后的容量是否大于需要的容量,如果小于,则把最小需要容量当作扩容后的新容量。并确保扩容后的容量不超过数组能设置的最大大小值。最后将老数组的数据复制到新的数组中。3.ArrayList和LinkedList区
private void ensureCapacityInternal(int minCapacity) { //扩容方法 minCapacity 期望的最小容量 10
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //如果数组为空
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //默认容量和期望的最小容量取最大值 10
}
ensureExplicitCapacity(minCapacity);//扩容方法
}
private void ensureExplicitCapacity(int minCapacity) {//扩容方法
modCount++;//修改次数+1
// overflow-conscious code //判断是否溢出
if (minCapacity - elementData.length > 0)//如果(默认容量)期望的最小容量-数组长度>0 说明数组不够用 需要扩容
grow(minCapacity); //扩容
}
private void grow(int minCapacity) {//扩容方法
// overflow-conscious code
int oldCapacity = elementData.length; //旧容量
int newCapacity = oldCapacity + (oldCapacity >> 1); //新容量=旧容量+旧容量/2 10+10/2=15
if (newCapacity - minCapacity < 0)//如果新容量-期望的最小容量<0 说明新容量还是不够用
newCapacity = minCapacity;//新容量=期望的最小容量
if (newCapacity - MAX_ARRAY_SIZE > 0)// 如果新容量-最大容量>0 说明新容量还是不够用 说明数组已经很大了 不能再扩容了
newCapacity = hugeCapacity(minCapacity);//新容量=最大容量
// minCapacity is usually close to size, so this is a win://期望的最小容量通常接近于size,所以这是一个赢利
elementData = Arrays.copyOf(elementData, newCapacity);//将数组扩容到新容量
}
// 此时就完成了ArrayList的扩容