调用set(int index, E element)方法时,首先会对索引值进行校验,判断索引是否越界,如果越界则会抛出 IndexOutOfBoundsException 异常。如果索引没有越界,则 set 方法会将指定位置的元素保存到一个临时变量中,然后将当前索引位置的值替换为新元素,并返回原有元素的值。
调用boolean remove(Object o)方法时,先会对参数Object o 进行校验,判断Object o是否为null,若为null,则移除数组元素中为null的元素,否则移除与Object o 一致的元素。最后将列表的size属性减1,并将被移除的元素置为null,以便垃圾回收。
publicbooleanremove(Object o){if(o ==null){for(int index =0; index < size; index++)if(elementData[index]==null){fastRemove(index);//快速移除returntrue;}}else{for(int index =0; index < size; index++)if(o.equals(elementData[index])){fastRemove(index);returntrue;}}returnfalse;}privatevoidfastRemove(int index){
modCount++;int numMoved = size - index -1;if(numMoved >0)System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size]=null;//列表长度减一,将移除元素赋为null}
七、E remove(int index) 源码分析
调用E remove(int index)方法时,先根据索引值进行判断,校验索引是否越界,将索引位置的元素值保存到一个临时变量中,将int index 索引位置加1到末尾的元素复制到当前索引位置,最后将列表的size属性减1,并将被移除的元素置为null,以便垃圾回收并返回索引位置元素旧值。
publicEremove(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 workreturn oldValue;}