当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("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集合移除自身集合元素时发生的诸多问题的更多相关文章
- Java入门教程十二(集合与泛型)
在 Java 中数组的长度是不可修改的.然而在实际应用的很多情况下,无法确定数据数量.这些数据不适合使用数组来保存,这时候就需要使用集合. Java 的集合就像一个容器,用来存储 Java 类的对象. ...
- Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序:Comparator)
1. 比较器排序(定制排序) 前面我们说到的TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列. 但是如果需要实现定制排序,比如实现降序排序,则要通过比较器排序(定制排序)实 ...
- Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素
1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5 ...
- Android java程序员必备技能,集合与数组中遍历元素,增强for循环的使用详解及代码
Android java程序员必备技能,集合与数组中遍历元素, 增强for循环的使用详解及代码 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 For ...
- Java常用的几种集合, Map集合,Set集合,List集合
Java中 Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...
- Java之数组array和集合list、set、map
之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊,直到看到了这篇文章,讲解的很清楚. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 ...
- Java基础知识强化之集合框架笔记04:Collection集合的基本功能测试
1. Collection集合的基本功能测试: package cn.itcast_01; import java.util.ArrayList; import java.util.Collectio ...
- Java入门——(6)集合
关键词:Collection接口.Map接口.Iterator接口.泛型.Collections工具类.Arrays工具类 一.集合概述 当数据多了需要存储,需要容器,而数据的个数 ...
- JAVA容器的那些事—集合
1.首先我们先讲下Collection接口 Collection接口:Collection是最基本的集合接口,它是由一个独立元素所组成的序列,这些元素服务一条或多条规则.一个Collection代表一 ...
随机推荐
- FFTW程序Demo
#include<stdio.h> #include<stdlib.h> #include <fftw3.h> #include<string.h> # ...
- python--data type
1.Python中常见的数据类型有: 数据类型 内建函数 整型 int(),long() 浮点型 float() 字符串型 str() 列表 list() 元组 t ...
- 关于QuartusII中的文件加密
有时候我们要把工程交接给别人,但是又不希望对方看到里面的东西.在网上查找了几位大牛的博客进行整合 来自coyoo博客 http://bbs.ednchina.com/BLOG_ARTICLE_2482 ...
- Apache中RewriteCond规则参数介绍(转)
CodeIgniter2.0已经出来有20多天了呢~也就是我一直用的php框架(CI).一直都在研究jquery,倒是把CI给忘到一边去了,呵呵~~今天公司事情不是很多,于是开始熟悉一下CI2.0的一 ...
- 引用 IP电话的原理结构及其关键技术
引用 茫然 的 两种将字符串转换成浮点数的方法 方法一: char szString[] = "-2876.99812376443"; double db1; db1 = atof ...
- viminfo: 无效的启动字符
当自己进入一个用户,使用vi打开一个文件时,出现以下情况: [gexd@localhost ~]$ vi test.c E575: viminfo: 无效的启动字符 位于行: int main() . ...
- cocos2dx进阶学习之屏幕适配
背景 在学习cocos2dx时,我们在main函数中发现一句代码, #include "main.h" #include "AppDelegate.h" #in ...
- IT第十八天 - 类的封装、继承、重载、上周总结★★★
IT第十八天 上午 封装 1.关键字this,是表示该类在实例化时的对象,即this.表示为该对象的属性 2.类的数据保护,set.get方法的写法规则,为了之后的反射机制的读取数据,set方法中对于 ...
- CSS中border-style的属性
属性可能的值 值 描述 none 定义无边框. hidden 与 "none" 相同.不过应用于表时除外,对于表,hidden 用于解决边框冲突. dotted 定义点状边框.在大 ...
- 点菜系统 pickview的简单实用
使用pickview的时候多想想tableview的使用,观察两者的相同之处 pickview的主要用途用于选择地区 生日年月日 和点餐 示例代码 简单的pickview点餐系统// ViewC ...