private void grow(int minCapacity) {
// minCapacity = size +1;
int oldCapacity = elementData.length;
// 新容量 = 原来的容量+原来的两倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 若新容量 < minCapacity, 则新容量=minCapacity。
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 若新容量超出MAX_ARRAY_SIZE,则新容量 = MAX_ARRAY_SIZE。
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);
}
remove
基本流程
校验index是否越界。index必须小于size。
modCount++。
获取该index对应的数据,需类型转换Object -> E,用于返回。
判断位于index之后的数据个数,若>0,则把index+1至size-1的数据前移1位。
最后一位赋值为null,等待GC。
返回 删除的数据(值)。
源码解析
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
// numMoved=位于index之后的数据个数。若个数>0,则需把index+1至size-1的数据向前移1位。
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
// 最后一位赋值为null,等待GC。
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}