Java基础之【使用迭代器删除List中的元素】

直接看代码以及代码中注释

iterator的remove跟list的remove区别是 迭代器会在remove后进行expectedModCount = modCount操作 这样就会避免

ConcurrentModificationException异常


public class ArrayListFailFast {
    public static void main(String[] args) {
        List 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 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 iterator=list.iterator();找到ArrayList的迭代器实现的remove方法

如下图:

Java基础之【使用迭代器删除List中的元素】_第1张图片

结论:不能使用List的remove进行元素删除,需要使用迭代器的删除方法 或者java8 removeIf方法 

你可能感兴趣的:(Java基础)