ArrayList对于两个相同的数字如何删除?
首先是ArrayList.remove(Object o)的源码:
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;}
可见当o != null的时候,会去从头开始遍历,并删除匹配到的第一个元素,然后直接返回。
其中fastRemove的源码为:
/** Private remove method that skips bounds checking and does not* return the value removed.*/private void fastRemove(int index) {// 操作计数器加一modCount++;// 要移动的元素数量int numMoved = size - index - 1;// 如果要移动的元素数量大于0if (numMoved > 0)// 将被删除元素之后的元素,全部向前移动一位System.arraycopy(elementData, index+1, elementData, index,numMoved);// 将size减一,然后把缩减前的最后一个元素所在位置的引用置为空(减少对象的引用),以让JVM执行GC将其回收elementData[--size] = null; // clear to let GC do its work}
该方法跳过边界检查且不会返回删除的值。
