zoukankan      html  css  js  c++  java
  • Java 遍历集合时产生ConcurrentModificationException异常

      做JAVA实验的时候用foreach遍历一个ArrayList集合,并且当集合中的某个元素符合某个值时删除这个元素。写完运行时抛出了ConcurrentModificationException异常

      当时代码与下方类似,在foreach循环时判断元素的值,当元素的值与2相等时删除

     1 package Test;
     2 
     3 import java.util.ArrayList;
     4 
     5 public class Main {
     6 
     7     public static void main(String[] args) {
     8         ArrayList<Integer> arr = new ArrayList<>();
     9         arr.add(1);
    10         arr.add(2);
    11         arr.add(3);
    12         arr.add(4);
    13         for(Integer id : arr){
    14             System.out.println(id);
    15             if( id == 2 ){          //当arr中某个元素的值为2时删除
    16                 arr.remove(id);
    17             }
    18         }
    19
    20     }
    21 }

    运行结果:
    1
    2
    Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at Test.Main.main(Main.java:15)

      产生了ConcurrentModificationException异常,网上查了查,foreach本质是调用的collection迭代器的接口,迭代器是依赖于集合存在的,当调用ArrayList的remove()方法时,集合发生了改变,而迭代器并没有重新获取,所以会抛出异常。

      解决方法是使用Iterator遍历,并且使用Iterator提供的remove()方法进行元素的删除,代码如下

     1 package Test;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 
     6 public class Main {
     7 
     8     public static void main(String[] args) {
     9         ArrayList<Integer> arr = new ArrayList<>();
    10         arr.add(1);
    11         arr.add(2);
    12         arr.add(3);
    13         arr.add(4);
    14         Iterator<Integer> iter = arr.iterator();
    15         while(iter.hasNext()){
    16             Integer i = iter.next();
    17             System.out.println(i);
    18             if( i == 2 ){
    19                 iter.remove();          //使用Iterator提供的remove方法
    20             }
    21         }
    22         System.out.println("--------------------");
    23         for(Integer id : arr){          //查看遍历后数组的值
    24             System.out.println(id);
    25         }
    26 
    27     }
    28 }

    运行结果:

    1
    2
    3
    4
    --------------------
    1
    3
    4

    Process finished with exit code 0

    值为2的元素成功删除,并且没有报错。

    在《阿里巴巴Java开发手册终极版》也有提到这个问题

  • 相关阅读:
    Django extra 和 annotate
    剑指offer——26反转链表
    剑指offer——25链表中环的入口节点
    剑指offer——24链表中倒数第k个结点
    剑指offer——23调整数组顺序使奇数位于偶数前面
    剑指offer——22表示数值的字符串
    剑指offer——21正则表达式匹配
    剑指offer——20删除链表中重复的结点
    剑指offer——19删除链表的节点
    剑指offer——18打印从1到最大的n位数
  • 原文地址:https://www.cnblogs.com/ELAIRS/p/11639776.html
Copyright © 2011-2022 走看看