1.removeIf
public boolean removeIf(Predicate<? super E> filter) {int removeCount = 0;// 位图final BitSet removeSet = new BitSet(size);final int expectedModCount = modCount;final int size = this.size;for (int i=0; modCount == expectedModCount && i < size; i++) {final E element = (E) elementData[i];// 条件满足if (filter.test(element)) {// 设置为trueremoveSet.set(i);removeCount++;}}if (modCount != expectedModCount) {throw new ConcurrentModificationException();}final boolean anyToRemove = removeCount > 0;if (anyToRemove) {final int newSize = size - removeCount;for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) {// 返回>=i的值为false的最近的下标i = removeSet.nextClearBit(i);elementData[j] = elementData[i];}for (int k=newSize; k < size; k++) {elementData[k] = null;}this.size = newSize;if (modCount != expectedModCount) {throw new ConcurrentModificationException();}modCount++;}return anyToRemove;}
2.removeAll
public boolean removeAll(Collection<?> c) {return batchRemove(c, false);}private boolean batchRemove(Collection<?> c, boolean complement) {final Object[] elementData = this.elementData;int r = 0, w = 0;boolean modified = false;try {for (; r < size; r++)if (c.contains(elementData[r]) == complement)elementData[w++] = elementData[r];} finally {if (w != size) {for (int i = w; i < size; i++)elementData[i] = null;modCount += size - w;size = w;modified = true;}}return modified;}
3.iterator
private class Itr implements Iterator<E> {int cursor;int lastRet = -1;int expectedModCount = modCount;Itr() {}public boolean hasNext() {return cursor != size;}public E next() {checkForComodification();int i = cursor;if (i >= size)throw new NoSuchElementException();Object[] elementData = ArrayList.this.elementData;if (i >= elementData.length)throw new ConcurrentModificationException();cursor = i + 1;return (E) elementData[lastRet = i];}public void remove() {if (lastRet < 0)throw new IllegalStateException();checkForComodification();try {ArrayList.this.remove(lastRet);cursor = lastRet;lastRet = -1;expectedModCount = modCount;} catch (IndexOutOfBoundsException ex) {throw new ConcurrentModificationException();}}final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}}
4.从后往前遍历
List<Long> list = new ArrayList<>(Arrays.asList(1L,2L,2L,4L,5L));for (int i = list.size() - 1; i >= 0; i--) {if (list.get(i) == 2) {list.remove(i);}}
5.i—
List<Long> list = new ArrayList<>(Arrays.asList(1L, 2L, 2L, 4L, 5L));for (int i = 0; i < list.size(); i++) {if (list.get(i) == 2) {list.remove(i);i--;}}
