(ArrayList中的add方法源码学习标记)
// ArrayList
public void add(int index, E element) {
rangeCheckForAdd(index);
// ArrayList有一个ModCount属性用来记录数组被修改的次数
ensureCapacityInternal(size + 1); // 先将数组长度数组修改次数+1
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
其中调用 ensureCapacityInternal(int minCapacity) 方法将数组的长度加1,然后调用 System.arraycopy 方法将原数组中下标index至结尾的元素整体向后复制1个单元,最后用的element元素覆盖原数组的index元素。
在这里贴出System.arraycopy的参数解释
//System
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
//src - 源数组。
//srcPos - 源数组中的起始位置。
//dest - 目标数组。
//destPos - 目的地数据中的起始位置。
//length - 要复制的数组元素的数量。
}
事实上ArrayList中就是依靠 private void grow(int minCapacity) 动态的改变数组长度,使用System.arraycopy 方法操作数组元素,其长度标识就是依靠size属性,每次操作数组的时候都会对size的值进行相应的更改,封装完成后ArrayList就成为了一个长度可变的数组啦。
仅学习过程中的个人见解,有错之处还请多多指正。