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