zoukankan      html  css  js  c++  java
  • 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。保证不继续循环就不会报错了。

  • 相关阅读:
    随机过程之第一次出现的期望
    js模板引擎介绍搜集
    qt的安装和debug
    $parse/$eval和$observe/$watch如何区分
    angular controller as syntax vs scope
    Angularjs Controller 间通信机制
    Ng-template寄宿方式
    angularjs移除不必要的$watch
    angularJs项目实战!02:前端的页面分解与组装
    推荐几个可以与PhoneGap很好搭配的UI框架
  • 原文地址:https://www.cnblogs.com/jk-jun/p/15264536.html
Copyright © 2011-2022 走看看