最近遇到一个小问题,我将其简化为下列代码,List的remove()方法在下列颜色注重的代码执行的源码也是不同的~
List<Integer> list=new ArrayList<>(); list.add(11); list.add(12); list.add(13); list.add(14); list.add(15); list.add(16); /*for (Integer i=0; i<list.size(); i++) { if (list.get(i) % 2 == 0) { list.remove(i); //执行删除指定位置的元素的功能 执行结果 [11,12,13,14,15,16] } }*/ for (int i=0; i<list.size(); i++) { if (list.get(i) % 2 == 0) { list.remove(i); //执行删除指定元素的功能 执行结果 [11,13,15] } } for(Integer i : list){ System.out.println(i); } }
上述执行的代码中remove调用的不是同一个方法分别是list重写的两个remove方法,分别为
public E remove(int index); //执行删除指定位置的元素的功能 public boolean remove(Object o) //执行删除指定元素的功能
// 删除ArrayList指定位置的元素 public E remove(int index) { RangeCheck(index);//检查index是否超出list大小范围,否则抛出异常 modCount++; E oldValue = (E) elementData[index];//elementData是实现list的数组 int numMoved = size - index - 1;//当执行删除操作是后面的元素全部向前面移动一位 if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; return oldValue; } // 删除ArrayList的指定元素 public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; }
//快速删除第index个元素
private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; }