直接看代码以及代码中注释
iterator的remove跟list的remove区别是 迭代器会在remove后进行expectedModCount = modCount操作 这样就会避免
ConcurrentModificationException异常
public class ArrayListFailFast {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
//这只是碰巧没触发ConcurrentModificationException异常
/* for (String s : list) {
if("two".equals(s)){
list.remove(s);
}
}*/
//使用迭代器删除列表中的元素
Iterator<String> iterator=list.iterator();
while (iterator.hasNext()){
//多线程情况下加锁
synchronized (list){
String item=iterator.next();
if("two".equals(item)){
//TODO 注意!!! 不是list的remove
iterator.remove();
}
}
}
System.out.println(list);
}
}
进行expectedModCount = modCount操作的具体位置:
通过Iterator<String> iterator=list.iterator();找到ArrayList的迭代器实现的remove方法
如下图:
结论:不能使用List的remove进行元素删除,需要使用迭代器的删除方法 或者java8 removeIf方法