• 迭代器使用过程中为什么抛出ConcurrentModificationException


          出现的场景:在迭代器对集合进行遍历的同时,集合本身进行变更操作(add(), remove(), set())。

    当正常调用时:

    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class TestDemo {
        public static void main(String[] args) {
            ArrayList<Integer> a = new ArrayList<>();
            a.add(1);
            a.add(3);
            a.add(5);
            a.add(6);
            Iterator<Integer> iterator = a.iterator();
            while (iterator.hasNext()){
                System.out.print(iterator.next()+" ");
            }
        }
    }

    结果:

     当调用interator()接口里面的remove()操作时:

     结果:

     

     当调用ArrayList的对象下的remove()或者add();

    或者

     

       便会报错:

     

     那么为何会出现这种情况呢?

            首先我们应该知道,ArrayList底层的modCount这个属性,这也是个版本记录号每对ArrayList进行一次增删改操作,都会进行modCount++操作。并且在迭代器的使用中,会将当前的modCount的值赋给expectedModCount迭代器的这个属性。

    我们先来看看得ArrayList内地迭代器的部分源码:

    可以看到每次Iterator的对象调用next()操作时,都会调用checkForComodification()的方法,具体我们来看看这个方法。

    再来看看迭代器中的remove()方法:

         可以看到迭代器中的remove()方法虽然也是用的ArrayList的remove()方法,正如前面所说,那也会对modCount的值进行改变,但是关键就在于expectedModCount = modCount,它会将改变的值重新赋给expectedModCount。然后每次用完迭代器中的remove()方法后,就算再次用nex()的方法,调用checkForComodification()方法,就不会抛出异常。但是如果直接用ArrayList的对象调用增删改的方法,modCount值得改变,不会引起expectedModCount值的变化,再次调用迭代器,调用到checkForComodification()方法时,便会抛出ConcurrentModificationException的错误。

         总的来说,在调用迭代器的时候,就用迭代器的remove()方法,否则就会出现错误,还有迭代器的一个对象只能进行一次迭代,要多次迭代,,便要创建多个对象。

  • 相关阅读:
    苹果CMS
    rel=nofollow 是什么意思
    如何获得select被选中option的value和text和......
    使用phpexcel导出到xls文件的时候出现乱码解决
    Infinispan's GridFileSystem基于内存的网格文件系统,互联网营销 狼人:
    云计算的可伸缩性迫使App服务无状态化,互联网营销 狼人:
    那些你知道的和不知道的搜索引擎,互联网营销 狼人:
    IPv6的未来,互联网营销 狼人:
    互联网上五个最高级的搜索引擎,互联网营销 狼人:
    剖析IE浏览器子系统的性能权重,互联网营销 狼人:
  • 原文地址:https://www.cnblogs.com/128-cdy/p/12031571.html
Copyright © 2020-2023  润新知