今天一個網友問我集合忘記了沒有,這一問讓我糾結了一下,最后決定把這個集合問題寫下來,以免自己在犯下類似的問題:
需要刪除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());
}
}
