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));}