`
uin57
  • 浏览: 7809 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

如何在遍历时删除List中的元素

JDK 
阅读更多

今天在写代码的时候突然脑袋短路了,不知怎么在遍历的时候删除List中的元素了。

于是就产生了下面一堆代码。。

 

代码1:foreach

for(TestObject to:testList){
            if(null==to){
               testList.remove(to); //这一行改变了集合内容
            }
           
        }

 于是乎:java.util.ConcurrentModificationException

JDK6手册上原话是这样子的:

JDK6 API 写道
public class ConcurrentModificationExceptionextends RuntimeException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。
注意,此异常不会始终指出对象已经由不同 线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败操作会尽最大努力抛出 ConcurrentModificationException。因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法,正确做法是:ConcurrentModificationException 应该仅用于检测 bug。

 

 

 

 

 

 

 

 Java中的For each实际上使用的是iterator进行处理的。而iterator是不允许集合在iterator使用期间删除的。而我在for each时,从集合中删除了一个元素,这导致了iterator抛出了ConcurrentModificationException。

 

代码2:get(i)

 

for(int i:i<testList.size();i++){
           TestObject to=testList.get(i);
            if(null==to){
               testList.remove(i); //这一行改变了集合内容
          }
           
        }

 于是乎:过滤的数据不完全。当有两个连续的元素为null的时候就会有漏网之鱼。

 原因在于:集合删除元素时,集合的size会变小,连带索引都会改变!

 

代码3:iterator

 

 

for (Iterator<TestObject> it = goodsList.iterator();it.hasNext();){
				TestObject to=it.next();
				if(to==null ){
					it.remove();
					
				}
			}

 

这次正确了

JDK手册中关于iterator中remove()方法的描述 写道

remove

void remove()
从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的集合,则迭代器的行为是不明确的。

 

抛出:
UnsupportedOperationException - 如果迭代器不支持 remove 操作。
IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。

 

 

分享到:
评论

相关推荐

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

    当我们需要遍历List并根据条件删除特定元素时,需要注意正确的方法,以避免在遍历过程中出现错误。以下将详细介绍如何在C#中遍历List并删除元素,包括正序和倒序遍历的技巧。 首先,我们来看一下错误的遍历方式。...

    C++ STL list 遍历删除出错解决方案

    本篇文章主要探讨的是在使用STL list时遇到的遍历删除元素过程中常见的错误及其解决方案。 错误用法通常出现在尝试同时遍历和删除list中的元素时。以下是三种常见的错误做法: 1. 错误用法一: 在这个例子中,迭代...

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

    在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...

    正确遍历删除List中的元素方法(推荐)

    总结,遍历删除List元素时,推荐使用Iterator,因为它提供了安全的遍历和修改集合的机制。对于仅删除一个元素的情况,可以使用增强的for循环配合`break`。然而,对于多元素删除,避免在增强的for循环中直接删除,...

    java中循环遍历删除List和Set集合中元素的方法(推荐)

    在Java编程中,遍历并删除集合(如List或Set)中的元素是一项常见的操作,但如果不正确地执行,可能会导致`ConcurrentModificationException`异常。这个异常通常在尝试修改正在迭代的集合时出现,因为Java的集合迭代...

    HashMap和List遍历方法及如何遍历删除元素总结

    HashMap和List遍历方法及如何遍历删除元素总结 HashMap和List都是Java中最常用的数据结构,它们都可以用来存储和操作数据。然而,在遍历和删除元素时,需要小心地处理,以免出现问题。下面总结了HashMap和List的...

    Iterator遍历过程中list删除导致异常

    当你想在迭代过程中删除元素时,应该使用`Iterator`的`remove()`方法,而不是直接调用集合的`remove()`方法。这样,`Iterator`会正确处理集合的内部状态,避免异常: ```java List&lt;String&gt; list = new ArrayList...

    C# 集合对象遍历性能测试

    ArrayList的优点在于其灵活性,可以存储任意类型的对象,但缺点是插入和删除元素时可能需要进行大量的元素移动,这在遍历过程中会影响性能。 其次,`Dictionary, TValue&gt;`是一个键值对的集合,基于哈希表实现。它的...

    java使用ListIterator对List遍历时添加修改删除​

    `ListIterator`还提供了在遍历过程中添加、修改和删除元素的功能,使得对列表的操作更加灵活。本文将详细介绍如何使用`ListIterator`进行这些操作。 ### 1. `ListIterator`的基本用法 要获取`List`的`ListIterator...

    java中List对象集合的遍历方法(三个)

    如果在遍历过程中需要移除元素,必须使用`it.remove()`,直接调用`list.remove()`会导致并发修改异常(ConcurrentModificationException)。 ### 第二种:增强型for循环(foreach) ```java for (A a : list) { /...

    Java如何在List或Map遍历过程中删除元素

    总结来说,在Java中遍历List或Map并删除元素时,应该避免在迭代过程中直接修改集合,而应该使用迭代器来管理删除操作。对于List,可以使用索引下标加调整索引,或者直接使用迭代器;对于Map,应根据需求选择键迭代或...

    解决JAVA遍历List集合,删除数据时出现的问题

    在遍历List集合时,我们可以使用for循环来删除元素,但是我们需要注意的是,在删除元素后,我们需要将迭代变量i的值减1,以便在下一次迭代中处理正确的元素。 解决方法2:先删除后面的元素 另一种解决方法是,先...

    java遍历list集合.zip

    迭代器适合需要在遍历过程中删除元素的情况,增强for循环简化了代码,下标遍历在需要索引时很有用,而Stream API则提供了更高级的处理功能,尤其是在Java 8之后。选择哪种方法取决于具体需求和项目上下文。

    jstl 遍历_jstl遍历_

    在实际应用中,我们可能需要将数据库查询结果或其他数据结构中的数据填充到HTML select元素中。以下是一个简单的例子: ```jsp ${yourList}" var="option"&gt; ${option.value}"&gt;${option.label} ``` 在这个例子...

    C#集合遍历时删除和增加元素的方法

    当我们需要在遍历集合的过程中删除或添加元素时,必须注意一些特定的策略,因为不是所有的集合类型都支持这种操作。这里我们将详细讨论如何在C#中处理这种情况,特别是在使用`LinkedList&lt;T&gt;`时。 首先,C#的标准...

    Python中list循环遍历删除数据的正确方法

    前言 初学Python,遇到过这样的问题,在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: ...原因是在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照

    【Java面试题】List如何一边遍历,一边删除?

    在Java编程中,遍历并删除List集合是一个常见的操作,但在实际编程中,如果不使用正确的方法,可能会导致`java.util.ConcurrentModificationException`异常。本文主要针对这个面试题,详细讲解如何在遍历List的同时...

    list遍历的五种方法

    在 Java 编程中,遍历 List 集合是一项常见的任务,特别是在处理数据或执行迭代操作时。这里,我们详细探讨了五种遍历 List 集合的方法,并结合 List 接口概述来理解其核心特性。 1. **普通 for 循环遍历** 这是最...

Global site tag (gtag.js) - Google Analytics