一段代码目的是想删除集合中包括“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. PHPExcel 生成excel统计表格

    db.php为数据库操作类, $config为数据库配置,PHPExcel版本为PHPExcel_1.8.0,  php代码: $dir = dirname(__FILE__); require $d ...

  2. 解决phpmyadmin配置文件的权限问题

    如果部署的phpmyadmin权限为所有人可写,即权限为777,就会报”Wrong permissions on configuration file, should not be world wri ...

  3. C#调用Java方法

    C#调用Java方法(详细实例) 阅读目录 C#调用c++ C#调用JAVA方法 C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具 ...

  4. mysqld守护进程

    1.安装方式:安装文件:可执行的二进制文件: 源代码编译. 2.版本选择:常见版本区别:GA(一般应用,尽量使用最新版本)/RC(候选发布版本)/测试版本实版本选择主要是够用.适用.好用!不一定是最新 ...

  5. c++ ptrdiff_t 类型

    ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型.ptrdiff_t类型变量通常用来保存两个指针减法操作的结果.ptrdiff_t定义在stddef.h(cstddef)这个文件内 ...

  6. 数据结构——AVL平衡树

    1.是二叉搜索树(Binary Search Tree) 2.树和所有左右子树高度之差为-1,0,1 平衡因子(balance factor) =右子树高度-左子树高度 平衡化旋转: 1.从插入位置向 ...

  7. Phonegap-----Media

    Everything in the code: <!DOCTYPE html> <html> <head> <title>Media Example&l ...

  8. Oracle同义词 synonyms

    Oracle中的同义词: 总结:简单的一句话,Oracle中不同用户的表一般都只能够自己的所属的用户可以用,如果不想通过授权的方式授权给其他用户使用,那么创建表的时候在表名的前面加上 synonyms ...

  9. [转]如何从MySQL官方Yum仓库安装MySQL5.6

    参考博文: 如何从MySQL官方Yum仓库安装MySQL5.6 Centos 升级Mysql版本或者Yum安装Mysql5.6 2013年10月,MySQL开发团队正式宣布支持Yum仓库,这就意味着我 ...

  10. php定时输出

    //PHP定时输出 ob_end_flush(); //关闭输出缓冲 set_time_limit(0); //设置最大执行时间为无限制 echo '============开始=========== ...