Java 遍历集合时产生的ConcurrentModificationException异常

  前几天作Java实验的时候,打算用foreach遍历一个ArrayList集合,而且当集合中的某个元素符合某个值时删除这个元素。写完运行时抛出了ConcurrentModificationException异常java

 

  当时代码与下方相似,在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)spa

 

  产生了ConcurrentModificationException异常,通过查询资料发现,foreach本质是调用的collection迭代器的接口,迭代器是依赖于集合存在的,当调用ArrayList的remove()方法时,集合发生了改变,而迭代器并无从新获取,因此会抛出异常。code

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

 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 0rem

 

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

 

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

相关文章
相关标签/搜索