首页 > 代码库 > 当JAVA集合移除自身集合元素时发生的诸多问题
当JAVA集合移除自身集合元素时发生的诸多问题
一段代码目的是想删除集合中包含“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("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方法。
原因:
iterator中的remove方法:
②如果只删除一个元素,可以forin语句删除元素后,通过break跳出循环
③使用解决这类异常线程安全集合 CopyOnWriteArrayList<E>
当JAVA集合移除自身集合元素时发生的诸多问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。