public E remove(intindex) { // 先检查下标索引是是否越界 rangeCheck(index); // ArrayList的修改次数加1 modCount++; // 获取索引对应的元素值 E oldValue = elementData(index); // 获取删除元素后,需要移动的元素的个数 int numMoved = size - index - 1; if (numMoved > 0) // 将元素进行移动拷贝 System.arraycopy(elementData, index+1, elementData, index, numMoved); // 最后将多出的位置设置为空,这样说明是没有引用的对象了 elementData[--size] = null; // Let gc do its work // 返回删除的旧值 return oldValue; }
publicboolean remove(Object o) { if (o == null) { for (intindex = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); returntrue; } } else { for (intindex = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); returntrue; } } returnfalse; }
privatevoid fastRemove(intindex) { modCount++; 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 }
privateclassItrimplementsIterator<E> { protectedint limit = ArrayList.this.size; //集合列表的个数尺寸 intcursor; //下一个元素的索引位置 int lastRet = -1; //上一个元素的索引位置 int expectedModCount = modCount;
publicbooleanhasNext(){ returncursor < limit; }
@SuppressWarnings("unchecked") public E next(){ //modCount用于记录ArrayList集合的修改次数,初始化为0, //每当集合被修改一次(结构上面的修改,内部update不算), //如add、remove等方法,modCount + 1,所以如果modCount不变, //则表示集合内容没有被修改。 if (modCount != expectedModCount) thrownew ConcurrentModificationException(); int i = cursor; //如果下一个元素的索引位置超过了集合长度抛出异常 if (i >= limit) thrownew NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) thrownew ConcurrentModificationException(); //调用一次cursor加一次 cursor = i + 1; //返回当前一个元素 return (E) elementData[lastRet = i]; }