一段代码目的是想删除集合中包括“a”字符串的集合项:
public class TestForeach { public static void main(String[] args){ //ArrayList<String> lists = new ArrayList<String>(); Collection<String> lists = new HashSet<String>(); lists.add("abvd"); lists.add("acvd"); lists.add("bvd"); lists.add("d"); lists.add("dfd"); lists.add("a"); Iterator<String> iter = lists.iterator(); while(iter.hasNext()){ String s = iter.next(); if( s.contains("a") ){ lists.remove(s); } } System.out.println(lists); } }
执行结果:
原因分析:
当不使用Iterator遍历集合元素时:
public class TestForeach { public static void main(String[] args){ ArrayList<String> lists = new ArrayList<String>(); lists.add("abvd"); lists.add("acvd"); lists.add("bvd"); lists.add("d"); lists.add("a"); for( int i=0 ; i<lists.size() ; i++){ String str = lists.get(i); if(str.contains("a")){ //lists.remove(i); lists.remove(str); } } System.out.println(lists); } }
输出结果:
[acvd, bvd, d]
acvd并没有被删除的原因是:
内存中,当删除了i=0的元素“abvd”时,i++ 而此时lists中i=0的位置变成了“acvd”也就是之前的i=0的下一个元素
解决方式 在删除集合中的元素时 :
① 不要使用 集合对象.remove(int i)/remove(Object o);而应该使用Iterator对象的remove方法或者在移除对象后将游标i-1。
原因:
iterator中的remove方法:
②假设仅仅删除一个元素。能够forin语句删除元素后,通过break跳出循环
③使用解决这类异常线程安全集合 CopyOnWriteArrayList<E>