ArrayList源码解析-jdk1.8之remove
方法remove(int index)
public E remove(int index) {
//rangeCheck()用于判断index是否在超过了能移除元素的范围
rangeCheck(index);
//操作数加1和获取元素
modCount++;
E oldValue = elementData(index);
//需要将index后面的数据向前移一位
//需要移动后面numMoved个数据
int numMoved = size - index - 1;
//使用arraycopy方法快速拷贝,后面详细介绍该方法
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//因为数据向前移了一位,所以size-1引用无用,赋值为null
elementData[--size] = null; // clear to let GC do its work
//返回移除的数据
return oldValue;
}
private void rangeCheck(int index) {
//下标大于等于size表示超过了移除元素的范围
//抛出异常
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
//得到下标为index的元素
E elementData(int index) {
return (E) elementData[index];
}
arraycopy()方法用于将一个数组的元素快速拷贝到另一个数组
是一个本地方法实现
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
- src表示源数组
- srcPos表示源数组中拷贝元素的起始位置
- dest表示目标数组
- destPos表示拷贝到目标数组的起始位置
- length表示拷贝元素的个数