← 返回首页
JavaSE基础教程(一百)
发表时间:2021-07-02 23:13:10
foreach修改集合元素问题

如何正确的删除集合中的元素?

foreach仅仅适合遍历集合元素,不要在foreach循环里对集合元素使用add和remove操作。

实例:

删除list中能被3整除的元素。

  List<Integer> list = new ArrayList<Integer>();
    for(int i=1;i<=10;i++){
         list.add(i);
    }
    for(Integer item : list){
       if(item%3==0){
        list.remove(item);
    }
 }
 System.out.println(list);

运行后抛出以下异常:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1043)
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:997)
    at com.oracle.demo.RemoveItemDemo.main(RemoveItemDemo.java:15)

foreach方式遍历元素的时候,是生成iterator,然后使用iterator遍历。在生成iterator的时候,会保存一个expectedModCount参数,这个是生成iterator的时候List中修改元素的次数。如果你在遍历过程中删除元素,List中modCount就会变化,如果这个modCount和exceptedModCount不一致,就会抛出异常。

在遍历集合的同时需要对元素进行add和remove操作,推荐使用iterator方式。

上面实例改下如下:

        List<Integer> list = new ArrayList<Integer>();
        for(int i=1;i<=10;i++){
            list.add(i);
        }
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
           Integer item = iterator.next();
           if(item%3==0){
               iterator.remove();
           }
        }

        System.out.println(list);

运行结果:

[1, 2, 4, 5, 7, 8, 10]

如果使用iterator方式修改元素时需要并发操作,需要对iterator对象加锁,实现同步操作。