什么是並發修改異常:
當我們在遍歷實現了collection接口與iterator接口的集合時(List、Set、Map), 我們可以通過遍歷索引也可以通過迭代器進行遍歷。在我們使用迭代器進行遍歷集合的時候,會獲取到當前集合的迭代對象。在里面有封裝了迭代器的remove方法與集合自帶的remove方法,如果我們調用迭代器對象的remove方法是沒問題的,但是當我們調用集合自帶的remove方法時,就會產生ConcurrentModificationException 並發修改異常。也就是說,當我們通過迭代器進行遍歷集合的時候,是不允許集合本身在結構上發生變化的。
示例代碼如下:
[java] view plain copy package iteratorDemo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ArrayListDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); for (int i = 0; i < 10; i++) { list.add(String.valueOf(i)); } System.out.println("遍歷之前集合的長度為:"); System.out.println(list.size()); //獲取集合的迭代器對象 Iterator<String> iterator = list.iterator(); //打印出迭代器的地址 System.out.println(iterator.toString()); //用iterator迭代器進行遍歷 while(iterator.hasNext()) { String next = iterator.next(); System.out.println(next); /** * 在使用迭代器的同時進行集合結構的變化 */ //list.remove(0); if(Integer.parseInt(next)%2==0) { //調用迭代器本身的remove方法 iterator.remove(); } } System.out.println("遍歷之后集合的長度為:"); System.out.println(list.size()); for (String string : list) { System.out.println("開始進行增強for循環下的刪除操作"); list.remove(0); } } }
運行之后的結果為:
遍歷之前集合的長度為: 10 java.util.ArrayList$Itr@5ecb5608 0 1 2 3 4 5 6 7 8 9 遍歷之后集合的長度為: 5
開始進行增強for循環下的刪除操作
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at iteratorDemo.ArrayListDemo.main(ArrayListDemo.java:35)
在上面通過增強for循環實現將集合進行遍歷,也產生了並發修改異常,因為在底層也是調用的迭代器。
如果在以后在迭代器遍歷時,需要對集合進行增刪操作時,要調用迭代器本身的remove方法。