java中在for循環中remove元素時的陷阱


java.util.ConcurrentModificationException

如果刪空了,會報上面這個異常

輸出結果如下:
remove前集合數據:a,a,b,a,a,

remove后集合數據:a,b,a,

為什么會出現這種情況?原因是集合的大小是動態變化的,在刪除第1個值為“a”的元素后,集合的大小已經發生了改變,但是i的值在刪除后繼續執行了加1操作,此時已經跳過了“a”元素后的元素(即原集合中第2個“a”元素)。

 

如下刪除集合中值為“a”的元素時:

import java.util.*;
 
public class Demo {
    
    public static void main(String[] args) throws Exception {
        
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("a");
        
        System.out.print("remove前集合數據:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        
        //刪除集合中值為“1”的數據
        for (int i = 0; i < list.size(); i++) {
            if ("a".equals(list.get(i))) {
                list.remove(i);
            }
        }
        
        System.out.println("");
        System.out.print("remove后集合數據:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
    }
}

 

解決方法:

1、在執行完remove操作后,對i的值進行減1操作,即修改后的代碼如下:
import java.util.*;
 
public class Demo {
    
    public static void main(String[] args) throws Exception {
        
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("a");
        
        System.out.print("remove前集合數據:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        
        //刪除集合中值為“a”的數據
        for (int i = 0; i < list.size(); i++) {
            if ("a".equals(list.get(i))) {
                list.remove(i);
                i--;
            }
        }
        
        System.out.println("");
        System.out.print("remove后集合數據:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
    }
}

 

2、用迭代器的方式刪除數據
import java.util.*;
 
public class Demo {
    
    public static void main(String[] args) throws Exception {
        
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("a");
        
        System.out.print("remove前集合數據:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        
        //刪除集合中值為“a”的數據
        Iterator<String> iter = list.iterator();
        while (iter.hasNext()) {
            String temp = iter.next();
            if ("a".equals(temp)) {
                iter.remove();
            }
        }
        
        System.out.println("");
        System.out.print("remove后集合數據:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
    }
}

 


免責聲明!

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



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