`
悲剧了
  • 浏览: 145345 次
  • 性别: 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);
		}
		
	}



分享到:
评论

相关推荐

    Android 批量移除集合中的空值

    提供的jar包"NullCollection"可能是针对这个问题的一个解决方案,它可能包含了一个预编译的类或方法,可以直接用于移除集合中的空值。使用这样的库可以简化代码,提高效率,因为它已经处理了所有细节。为了在项目中...

    C#遍历List并删除某个元素的方法

    在这个例子中,我们从List的最后一项开始遍历,如果满足删除条件,就移除该元素。由于是从后向前遍历,即使删除了元素,也不会影响前面未处理的元素。 然而,倒序遍历虽然可以解决跳过元素的问题,但删除操作的效率...

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

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

    在list集合中输入元素,去除重复的元素并输出

    根据给定文件的信息,本文将详细介绍如何在Java的List集合中去除重复元素的三种方法:使用for循环、使用迭代器以及利用HashSet的特性。 ### 一、使用for循环去除重复元素 这种方法的基本思想是通过双重循环来遍历...

    Java集合面试问题

    - **功能**:`Iterator`接口用于遍历集合中的元素,提供了一种方式来访问集合元素而无需暴露集合的具体实现。 - **方法**: - `hasNext()`:判断是否还有下一个元素。 - `next()`:返回集合中的下一个元素。 - `...

    php-leetcode题解之移除元素.zip

    本压缩包"php-leetcode题解之移除元素.zip"显然是针对LeetCode平台上的一类问题——“移除元素”进行解答的集合。 “移除元素”的问题在实际编程中很常见,它可能涉及数组或链表等数据结构。例如,我们可能需要从...

    Java集合框架总结

    - `void removeAll(Collection c)`:移除集合中出现在指定集合中的所有元素。 - `void retainAll(Collection c)`:保留集合中出现在指定集合中的元素,移除其他元素。 - `Object[] toArray()`:将集合转换为数组...

    删除数组中的元素vb6

    当需要从数组中移除某个元素时,通常需要采用一定的策略来实现这一操作,因为VB6的数组是静态的,不像某些现代编程语言那样支持动态调整大小或直接删除元素。以下是一些关于如何在VB6中删除数组元素的知识点: 1. *...

    c语言实现集合运算

    3. **删除元素**:从集合中移除特定元素。数组中删除元素后需要将后面的元素前移,链表中则只需改变相邻节点的链接关系。 4. **判断元素是否属于集合**:检查一个元素是否存在于集合中。在数组中,可以通过遍历数组...

    java集合与泛型[参照].pdf

    - remove():移除集合中的元素。 - iterator():返回一个Iterator对象,用于遍历集合。 2. 批量操作: - containsAll():判断集合是否包含另一个集合的所有元素。 - addAll():将指定集合的元素添加到当前集合...

    python内置的集合set中元素顺序-python基础教程:set(集合).pdf

    - 删除任意元素:`s.pop()` - 会随机移除并返回一个元素,若集合为空,将引发`KeyError`。 - 判断元素是否存在:`element in s` 或 `element not in s` 集合的内置函数: 1. `len(s)`:返回集合中元素的个数。 2. `...

    Java集合排序及java集合类详解.pdf

    - **迭代器**:Iterator接口用于遍历集合元素,提供了一种顺序访问集合元素的方式,而无需暴露集合的底层结构。迭代器的主要方法包括`hasNext()`、`next()`和`remove()`等。 #### 四、List List是Collection的一...

    Java Collection 移除元素方法及注意事项

    5. 新的集合元素删除操作 Java 8 提供了新的集合操作 API 和 Stream 来帮助我们解决这个问题。 5.1 Collection.removeIf() 新的 Collection Api removeIf(Predicate&lt;? super E&gt; filter) 提供了一种更简洁的使用 ...

    c sharp 集合的问题

    而集合则允许动态地添加或移除元素,其大小可以随需求变化。 2. **类型约束**:数组需要在声明时指定元素类型,而集合通常使用`object`作为基础类型,允许存储任何对象,这提供了更大的灵活性。C# 2.0及以后版本...

    集合的几个运算

    在给出的代码中,`typedef struct pointer`定义了一个结构体,其中包含一个字符成员`dat`(用于存储集合元素)和一个指向下一个结构体的指针`link`(用于构建链表)。这种结构允许我们方便地存储和操作集合中的元素...

    JAVA中常用的集合类型

    * E remove(int index) 移除集合中指定位置的元素 * E set(int index, E element) 用指定元素替换集合中指定位置的元素 * boolean add(E o) 向列表的尾部追加指定的元素 * boolean contains(Object o) 如果列表包含...

    集合的运算

    - **创建集合**:使用`set`或`unordered_set`的构造函数,可以初始化集合元素。 - **插入元素**:通过`insert`函数将元素添加到集合中。 - **删除元素**:`erase`函数用于从集合中移除元素。 - **集合运算**:...

    数据结构课程设计之集合运算

    7. 删除(Delete):从集合中移除指定元素。对于动态集合,哈希表或平衡二叉搜索树是较好的选择。 在完成课程设计时,你需要编写清晰的源代码,确保每个操作的正确性,并进行充分的测试。此外,分析运行结果,讨论...

Global site tag (gtag.js) - Google Analytics