`
悲剧了
  • 浏览: 140126 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

移除集合元素问题

 
阅读更多
下面是我在项目中遇到的常见集合移除错误,刚开始自己也是犯错不断
为了方便叙述,先写一个测试类,然后加入测试,看看哪种情况你也存在问题,欢迎大家都来晒问题,并给出问题分析

public class TestList {

	private List<Object> list = null;

	@Before
	public void init() {
		list = new ArrayList<Object>();
		for (int i = 0; i < 10; i++) {
			list.add(new Object());
		}
	}

	
	@After
	public void print(){
		System.out.println(list.size());
		for(Object str:list){
			System.out.println(str);
		}
		
	}
}


问题一:增强for循环移除list项,java.util.ConcurrentModificationException,不支持迭代移除
@Test
	public void testForLoop01() {
		/**
		 * 增强的for循环遍历时候产生问题
		 * java.util.ConcurrentModificationException
		 */
		
		for (Object str : list) {
			list.remove(str);
		}
	}

问题二:size本身变化,i比较的值存在问题
@Test
	public void testForLoop02(){
		/**
		 * size在变化导致移除产生问题
		 */
		for(int i=0;i<list.size();i++){
			list.remove(i);
		}
	}


问题三:问题依旧,list大小随着移除本身变化问题,
@Test
	public void testForLoop03(){
		
		int length=list.size();
		for(int i=0;i<length;i++){
			list.remove(i);
		}
	}

综上给出正确的方式
	@Test
	public void testForLoop04(){
		int length=list.size();
		for(int i=length-1;i>0;i--){
			list.remove(i);
		}
	}



问题四:既然增强的for循环是调用的迭代器,存在问题是由于并发修改报的错,那么是否可以用并发工具集合避免这个问题,测试解决
@Test
	public void testCurrentCollection(){
		/**
		 * 最终并没有一个需要的结果,虽然不报异常
		 */
		 list=new CopyOnWriteArrayList<Object>();
		for (int i = 0; i < 10; i++) {
			list.add(new Object());
		}
		for (Object str : list) {
			list.remove(str);
		}
		
	}



分享到:
评论

相关推荐

    C#遍历集合与移除元素的方法

    本文实例讲述了C#遍历集合与移除元素的方法。分享给大家供大家参考,具体如下: 如果用foreach,会造成被遍历的集合更改后带来异常问题。 此时,用for循环可有效的解决这个问题。 for(int i=0;i&lt;List&gt; newlists=new...

    测量程序编制 - python 52数据类型:Set(集合)-函数.pptx

    移除集合中的元素,该元素在指定的集合也存在。 6 discard() 删除集合中指定的元素 7 intersection() 返回集合的交集 8 intersection_update() 返回集合的交集。 9 isdisjoint() 判断两个集合是否包含相同的元素,...

    Java集合框架Collection接口.pdf

    Collection接口概念 Java集合框架是Java编程中的一个非常重要的部分,提供了一组用于处理数据集合的接口和类。其中Collection接口是Java...4、removeAll(Collection c):移除集合c中的所有元素; 5、retainAll(Collect

    C++简单集合类的实现方法

    从集合中移除元素,移除之前需要先判断集合中元素是否存在  3.重载+运算符,用以实现集合的求并集运算  4.重载*运算符,用以实现集合的求交集运算  1.类的整体设计 该问题需要模拟实现集合类,我们可以使用数组...

    Python程序设计:集合的方法.pptx

    移除集合中的元素,该元素在指定的集合也存在 set1.discard(x) 从集合set1中删除元素x。不存在不会报错 set1.intersection() 返回多个集合的交集 set1.intersection_update() 返回集合的交集,该元素在指定的集合也...

    集合anylist要进行筛选.pdf

    集合本身上也是一种类型,基本上可以将其作为用来存储一组数据对象的容器,由于c#面向对象的特性,管理数据对象的集合同样被实现成为对象,而存储在集合中的数据对象则被称为集合元素。这里提到了接口这个概念,它也...

    求2个集合的交集

    RemoveWhere 方法 从HashSet集合中移除与指定谓词所定义的条件相匹配的所有元素 SetEquals 方法 确定HashSet对象与指定的集合中是否包含相同的元素 SynmmetricExceptWith 方法 修改当前的HashSet对象,以仅...

    删除JAVA集合中元素的实现代码

    有时候我们要删除集合中的某些元素,那么就可以参考下面的代码

    Python中集合分析

    移除集合中的元素,该元素在指定的集合也存在。 set.discard() 删除集合中指定的元素 set.intersection() 返回集合的交集 set.intersection_update() 返回集合的交集。 set.isdisjoint() 判断两个集合是否...

    快速学习-Python Set集合

    11. Set集合 集合不支持切片操作。 11.1 Set集合创建 s = {'name','aa','bb'} s = set(序列) # dict序列,值...s.discard(x) # 移除集合(不存在不报错) s.pop() # 随机删除集合中的一个元素 11.4 集合操作方法 方法

    测量程序编制 - python 51数据类型:Set(集合)-对称差集.pptx

    2) symmetric_difference()方法:返回两个集合中不重复的元素集合,即会移除两个集合中都存在的元素 语法: set. symmetric_difference(set1, set2 ... etc) set1 -- 必需,要查找相同元素的集合,可以是任何序列 ...

    java集合-ArrayDeque的使用

    你可以将元素添加到队列的头部或尾部,并且可以从头部或尾部移除元素。 基于数组实现:ArrayDeque 内部使用循环数组来存储元素。这种实现方式使得在两端进行插入和删除操作时具有较高的效率。 不允许存储 null ...

    如何使用C++实现一个简单的集合类?

     从集合中移除元素,移除之前需要先判断集合中元素是否存在  重载+运算符,用以实现集合的求并集运算  重载*运算符,用以实现集合的求交集运算  1.类的整体设计  该问题需要模拟实现集合类,我们可以使用...

    C#在foreach遍历删除集合中元素的三种实现方法

    主要给大家总结介绍了关于C#在foreach遍历删除集合中元素的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Yii redis集合的基本使用教程

    用户可以快速地对集合执行添加元素操作、移除元素操作以及检查一个元素是否存在于集合中。这里介绍一些常用的集合处理命令,并在 Yii 中的使用。 SADD SADD:SADD key-name item [item …] 将一个或多个元素添加到...

    c# 数组与集合(ArrayList)游戏开发高级使用举例

    优点:ArrayList 可以根据使用大小按需动态增加,不用事先设置大小,可以随意的添加数据,插入或移除某一范围元素也比较方便。 缺点:因为ArrayList 插入值的类型都是当做Object 类型插入的,所以当调用数据的时候...

    Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法

    问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1、如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决。 # example.py # # Remove duplicate entries from a sequence...

    List和Set集合基础详解

    文章目录一. 为什么要有集合?二. 集合的家族(1)List集合—(有序,可重复)(2)Set集合—(无序,唯一) 一. 为什么要有集合? 集合是为了弥补数组的不足而存在。 ...移除此 collection 中的所有元素

    Java集合容器面试题(2020最新版)

    文章目录集合容器概述什么是集合集合的特点集合和数组的区别使用集合框架的好处常用的集合类有哪些?List,Set,Map三者的区别?...如何边遍历边移除 Collection 中的元素?Iterator 和 ListIterator 有什么区别?

Global site tag (gtag.js) - Google Analytics