java中循環遍歷刪除List和Set集合中元素的方法


今天一個網友問我集合忘記了沒有,這一問讓我糾結了一下,最后決定把這個集合問題寫下來,以免自己在犯下類似的問題:

需要刪除List和Set中的某些元素,當時使用邊遍歷,邊刪除的方法,卻報了以下異常:ConcurrentModificationException為了以后不會忘記,和也給遇到同樣問題的同事提供一個參考:

出現錯誤的代碼如下所示:

package set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo {

	public static void main(String[] args) {
		Set<Object> obj = new HashSet<Object>();
		obj.add("a");
		obj.add("b");
		obj.add("c");
		System.out.println("移除前:" + obj.toString());
		Iterator<Object> it = obj.iterator();
		for(int i=0; i<obj.size(); i++){
			System.out.println(i);
			Object name = it.next();
			if("a".equals(name) || "b".equals(name)){
				obj.remove(name);
				i--;
			}
		}
		System.out.println("移除后: " + obj.toString());
		
	}

}

使用上面的寫法就會報上面的ConcurrenModificationException異常,原因是,集合不可以一邊遍歷一邊刪除。

對List的正確操作是:

package list;

import java.util.*;

public class Demo {

	public static void main(String[] args) {
		List<Object> obj = new ArrayList<Object>();
		obj.add("a");
		obj.add("b");
		obj.add("c");
		System.out.println("移除前:" + obj.toString());
		Iterator<Object> it = obj.iterator();
		for(int i=0; i<obj.size(); i++){
			System.out.println(i);
			Object name = it.next();
			if("a".equals(name) || "b".equals(name)){
				it.remove();
				i--;
			}
		}
		System.out.println("移除后: " + obj.toString());
		
	}

}

對Set的正確操作是:  

package set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo {

	public static void main(String[] args) {
		Set<Object> obj = new HashSet<Object>();
		obj.add("a");
		obj.add("b");
		obj.add("c");
		System.out.println("移除前:" + obj.toString());
		Iterator<Object> it = obj.iterator();
		for(int i=0; i<obj.size(); i++){
			System.out.println(i);
			Object name = it.next();
			if("a".equals(name) || "b".equals(name)){
				it.remove();
				i--;
			}
		}
		System.out.println("移除后: " + obj.toString());
		
	}

}

 


免責聲明!

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



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