紧接上篇,下面继续讲解ArrayList的源码
在add方法后, 继续讲解remove()方法
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
在remove方法,get方法执行的第一步都会执行rangeCheck(index)方法,这个方法如下
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
就是判断传进来的下标,是否超过了数组的总长度,抛出数组越界异常。 remove方法就是把想删除的元素之后,全部向前移动一位,然后把数组的最后一位置为空(让gc回收,以前博客讲解过),同时size的变量要减1,这时候elementData.lenght会比size大于,所以这就是为什么判断数组的长度不能使用elementData.length, 而必须使用变量size来做长度标记。
ArrayList 的get 方法就比较简单,直接返回底层数组下标返回的对象就可以了,如下
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
E elementData(int index) {
return (E) elementData[index];
}