前幾天作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