privatevoidfastRemove(int index){ 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 }
1)使用普通的 for 循环不会触发迭代器的 fail-fast 机制,but,list 元素会减少,下表会改变,很明显会出现漏删的情况。
List lists = new ArrayList<>() {{ add("Xiao Bai Tiao1"); add("Xiao Bai Tiao1"); add("Xiao Bai Tiao2"); add("Xiao Bai Tiao3"); }};
for(int i = 0;iif (lists.get(i).equals("Xiao Bai Tiao1")) { lists.remove(list); } } System.out.println(lists);
2)使用迭代器的 Remove 方法
List lists = new ArrayList<>() {{ add("Xiao Bai Tiao1"); add("Xiao Bai Tiao1"); add("Xiao Bai Tiao2"); add("Xiao Bai Tiao3"); }}; Iterator iterator = lists.iterator(); while(iterator.hasNext()){ if (iterator.next().equals("Xiao Bai Tiao1")) { iterator.remove(); } } System.out.println(lists);
3)使用 fail-safe 集合安全的类
ConcurrentLinkedDeque lists = new ConcurrentLinkedDeque<>() {{ add("Xiao Bai Tiao1"); add("Xiao Bai Tiao1"); add("Xiao Bai Tiao2"); add("Xiao Bai Tiao3"); }}; for (String list : lists) { if (list.equals("Xiao Bai Tiao1")) { lists.remove(); } } System.out.println(lists);
4)Java 8 的 Stream 流
List lists = new ArrayList<>() {{ add("Xiao Bai Tiao1"); add("Xiao Bai Tiao1"); add("Xiao Bai Tiao2"); add("Xiao Bai Tiao3"); }}; lists = lists.stream().filter(list -> !list.equals("Xiao Bai Tiao1")).collect(Collectors.toList()); System.out.println(lists);
5)使用增强 for 循环,但是删除后立刻 break 退出。
List lists = new ArrayList<>() {{ add("Xiao Bai Tiao1"); add("Xiao Bai Tiao2"); add("Xiao Bai Tiao3"); }};
for (String list : lists) { if (list.equals("Xiao Bai Tiao2")) { lists.remove(list); break; } }