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