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()); } }