java.util.ConcurrentModificationException 异常原因和解决方法

一、设计知识点:

  集合中的remove()方法和迭代器Iterator的remove()方法区别。

  设计引用原文链接:https://blog.csdn.net/hqqkkc/article/details/108753890。

  (2条消息) java.util.ConcurrentModificationException 异常原因和解决方法_y4ung-CSDN博客

   1、集合的remove 

        
        Collection c=new ArrayList();
        c.add(23);
        c.add("ABCD");
        System.out.println(c);
        c.remove(23);
        System.out.println(c);
        
      //输出结果
        [23, ABCD]
        [ABCD]

  整体来说集合的remove()的方法,就像数组删掉一个元素一样,很好理解。

2、在迭代过程中使用集合的remove()的方法。

       Collection c2=new ArrayList();
        c2.add(10);
        c2.add("ABC");
        c2.add("DEF");
        c2.add("H");
        Iterator i=c2.iterator();
        while (i.hasNext()){
            Object o=i.next();
            c2.remove(o);
            System.out.println(o);
        }

 

 

 此时,就会报我们遇到的异常.这是为什么呢?

原因:

  当删除元素10后,集合发生了结构变化时,迭代器必须要重新获取。而在下一次循环,却没有获取新的迭代器,所以发生了异常。

所以在迭代集合的元素时,不能使用集合对象的remove()方法。

解决办法:使用迭代器中的remove()方法。

3、使用迭代器的remove()方法删除集合元素。

        Collection c2=new ArrayList();
        c2.add(10);
        c2.add("ABC");
        c2.add("DEF");
        c2.add("H");
        //获取c的迭代器
        Iterator i=c2.iterator();
        while (i.hasNext()){//判断集合内是否还有元素
            Object o=i.next();//获取该元素
            i.remove();//【使用迭代器】删除当前指向的元素
        }
        System.out.println(c2);//查看集合的元素
        System.out.println(c2.size());//查看集合的个数
        
        //输出结果
        []
        0

在获取迭代器时候,相当于对此时的集合获取了一个当前的状态。而迭代器迭代时,参考该状态进行迭代。如果在迭代时候,集合发生了改变,那么得重新获取集合此时的状态,作为新参考,方便迭代。
使用【迭代器remove】时候,会将删除的元素从状态当中一并删除,那么就相当于更新了迭代器,更新了状态。
而使用【集合remove】时,直接删除元素,没有更新迭代器,没有更新状态,导致目前的状态和原状态不一样。

 

此外:使用集合的remove()方法,只要romove的时候顺带着写个return。保证不继续循环就不会报错了。

 

posted @ 2021-09-13 19:39  大科比的小弟  阅读(493)  评论(0编辑  收藏  举报