一段代码目的是想删除集合中包括“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>

当JAVA集合移除自身集合元素时发生的诸多问题的更多相关文章

  1. Java入门教程十二(集合与泛型)

    在 Java 中数组的长度是不可修改的.然而在实际应用的很多情况下,无法确定数据数量.这些数据不适合使用数组来保存,这时候就需要使用集合. Java 的集合就像一个容器,用来存储 Java 类的对象. ...

  2. Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序:Comparator)

    1. 比较器排序(定制排序) 前面我们说到的TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列. 但是如果需要实现定制排序,比如实现降序排序,则要通过比较器排序(定制排序)实 ...

  3. Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素

    1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5 ...

  4. Android java程序员必备技能,集合与数组中遍历元素,增强for循环的使用详解及代码

    Android java程序员必备技能,集合与数组中遍历元素, 增强for循环的使用详解及代码 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 For ...

  5. Java常用的几种集合, Map集合,Set集合,List集合

    Java中  Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...

  6. Java之数组array和集合list、set、map

    之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊,直到看到了这篇文章,讲解的很清楚. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 ...

  7. Java基础知识强化之集合框架笔记04:Collection集合的基本功能测试

    1. Collection集合的基本功能测试: package cn.itcast_01; import java.util.ArrayList; import java.util.Collectio ...

  8. Java入门——(6)集合

       关键词:Collection接口.Map接口.Iterator接口.泛型.Collections工具类.Arrays工具类   一.集合概述      当数据多了需要存储,需要容器,而数据的个数 ...

  9. JAVA容器的那些事—集合

    1.首先我们先讲下Collection接口 Collection接口:Collection是最基本的集合接口,它是由一个独立元素所组成的序列,这些元素服务一条或多条规则.一个Collection代表一 ...

随机推荐

  1. python之高阶函数编程

    在这篇文章中我指出两点: 第一:系统函数可以被覆盖 比如: a=abs(-10) print a 10 但是,如果把函数本身赋值给变量呢? f = abs f <built-in functio ...

  2. JavaSE学习总结第09天_面向对象4

      09.01 final关键字引入 例: class Fu { public final void show() { System.out.println("访问底层资源"); ...

  3. 《Java TCP/IP Socket 编程 》读书笔记之十一:深入剖析socket——TCP套接字的生命周期

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/16113083 建立TCP连接      新的Socket实例创建后,就立即能用于发送和接收 ...

  4. hibernate Criteria查询 2.3

    Criteria对象提供了一种面向对象的方式查询数据库.Criteria对象需要使用Session对象来获得一个Criteria对象表示对一个持久化类的查询 查询所有 Session session ...

  5. Mac OS X10.9安装的Python2.7升级Python3.3步骤详解

    Mac OS X10.9默认带了Python2.7,不过现在Python3.3.3出来了,如果想使用最新版本,赶紧升级下吧.基本步骤如下 第1步:官网下载Python3.3 这里面有windows和m ...

  6. cocos2d-x游戏开发系列教程-超级玛丽10-怪物与马里奥冲突检测

    在超级玛丽游戏中,马里奥在移动,怪物也在移动,当他们遇见时,需要判断是马里奥身亡还是怪物身亡. 这个判断的代码在怪物类的检测函数实现中. 比如蘑菇怪的冲突检测函数: bool CMMonsterMus ...

  7. Vijos P1740聪明的质检员

    题目 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是:1.给定m个区间[Li,Ri]:2. ...

  8. ARPU_百度百科

    ARPU_百度百科 ARPU

  9. 雪佛兰Suburban_百度百科

    雪佛兰Suburban_百度百科 雪佛兰Suburban

  10. HDU 4731 Minimum palindrome 2013 ACM/ICPC 成都网络赛

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4731 题解:规律题,我们可以发现当m大于等于3时,abcabcabc……这个串的回文为1,并且字典数最小 ...