List集合遍歷時修改元素出現並發修改異常總結


什么是並發修改異常:

當我們在遍歷實現了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方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM