private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //调用无参构造时 elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); // 想要的容量为 默认大小和需要扩容量中最大的
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0) //最小容量>数组缓冲区当前长度
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length; //获取当前数组的容量
int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容 新的容量=当前容量+当前容量/2.即将当前容量增加一半(当前容量增加1.5倍)。
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);
}
//进行大容量分配
private static int hugeCapacity(int minCapacity) {
//如果minCapacity<0,抛出异常 当最小扩容量比Integer.MAX_VALUE大时,会小于0 Integer.MAX_VALUE + 1 < 0
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//如果想要的容量大于MAX_ARRAY_SIZE,则分配Integer.MAX_VALUE,否则分配MAX_ARRAY_SIZE
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE; //如果想要的容量大于MAX_ARRAY_SIZE,则分配Integer.MAX_VALUE,否则分配MAX_ARRAY_SIZE
}
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
// 对数组进行复制处理,目的就是空出index的位置插入element,并将index后的元素位移一个位置
//在插入元素之前,要先将index之后的元素都往后移一位
//arraycopy(原数组,源数组中的起始位置,目标数组,目标数据中的起始位置,要复制的数组元素的数量)
// 例如add(0,3)操作 [1,2] -> [1,1,2] -> [3,1,2]
elementData[index] = element;
size++;
}
private void rangeCheckForAdd(int index) {
if (index > size || index < 0) //判断要操作的数组下标是否越界
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}