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

相關文章
相關標籤/搜索