`

Iterator 循环 List 使用remove方法报错的分析与解决办法。

 
阅读更多
1、实例代码:
Collection<String> coll = new ArrayList<String>();
		coll.add("123");
		coll.add("234");
		coll.add("456");
		for (Iterator<String> it = coll.iterator(); it.hasNext();) {
			String object = it.next();
			System.out.println(object);
			if ("123".equals(object)) {
				coll.remove(object);
			}
		}

初步看一下是否能找出代码存在的问题?

以上代码执行就会报异常:java.util.ConcurrentModificationException


通过异常进行分析:

in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)

原因:

当集合使用Iterator进行迭代的时候,实际是new Itr()创建一个内部对象,初始化包含对象个数,可以理解为在独立线程中操作的。Iterator创建之后引用指向原来的集合对象。当原来的对象数量发生变化时,这个内部对象索引表内容其实是不会同步的。所以,当索引指针往后移动的时候就找不到要迭代的对象了。内部对象操作时为了避免这种情况都会通过checkForComodification方法检测是否一致,不一致提前抛出异常ConcurrentModifiedException。

解决办法:
Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException ,这个异常顾名思意:当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的 remove() 方法是个安全的做法。



分享到:
评论

相关推荐

    List.removeAll() 方法的性能效率

    在Java编程语言中,`List.removeAll()`方法是一个非常实用的函数,它允许我们从列表中一次性移除所有指定元素。这个方法是集合框架的一部分,它提供了高效的方式来进行元素的删除操作。本文将深入探讨`removeAll()`...

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

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

    jsp自定义标签iterator遍历list[整理].pdf

    本文主要介绍了在 JSP 中使用自定义标签 Iterator 遍历 List,并对标签的实现过程进行了详细的解释。 标签的概念和作用 在 JSP 中,标签是一种特殊的组件,它可以根据需要执行不同的操作。自定义标签可以满足特定...

    关于方法iterator()找不着的问题~~~~~

    为了安全地修改集合,可以使用`Iterator`的`remove()`方法或者使用`CopyOnWriteArrayList`等线程安全的集合类。 6. **语法错误**: 检查你的代码中是否有拼写错误或者语法错误,例如,可能误将`iterator()`写成了`...

    Hibernate教程24_Hibernate的补充_list与iterator

    本教程将重点讲解在使用Hibernate时,如何处理查询结果集合,特别是通过`list()`和`iterator()`方法进行数据迭代的操作。 【描述】"http://blog.csdn.net/e421083458/article/details/8794127" 这个链接指向的是一...

    webwrok iterator标签status属性使用方法

    ### WebWork Iterator 标签 Status 属性使用方法详解 在Web开发中,处理列表数据时经常需要用到迭代器来遍历并展示数据。WebWork框架提供了一个强大的`&lt;ww:iterator&gt;`标签,它允许开发者轻松地遍历集合或数组,并...

    iterator 遍历循环代码

    ### Iterator遍历循环代码知识点详解 #### 一、概述 在Java编程语言中,集合框架是处理一组数据的重要工具之一。对于集合中的元素进行遍历是常见操作,而`Iterator`接口则是Java中最常用的一种遍历集合的方式。...

    JAVA中的Iterator的用法

    本文将深入探讨`Iterator`的基本概念、使用方法以及其实现原理,帮助读者更好地理解和使用这一强大的工具。 #### 二、`Iterator`接口介绍 `Iterator`接口位于`java.util`包中,是集合框架的一部分。它定义了三个...

    浅谈java Iterator.remove()方法的用法(详解)

    Java中的`Iterator.remove()`方法是迭代器接口的一个关键方法,用于在遍历集合时删除当前元素。这个方法的使用必须遵循一定的规则,否则可能会导致运行时异常。在深入讲解`Iterator.remove()`之前,我们先来了解一下...

    Iterator详解

    在循环中,通常与`next()`方法一起使用来控制循环条件,如: ```java while (iter.hasNext()) { String str = iter.next(); System.out.println(str); } ``` 4. **next()方法**: `next()`方法返回集合中的...

    java集合迭代器Iterator中的remove陷阱

    1. **只能通过`Iterator`删除元素**:在Java中,当使用`Iterator`遍历集合时,推荐使用`Iterator`的`remove()`方法来删除元素,而不是直接调用集合对象的`remove()`方法。因为这可能会导致`...

    hashMap利用iterator迭代器迭代元素方法

    如果必须修改,可以使用`Iterator`的`remove()`方法,或者使用Java 8引入的流(Stream)API,这样可以在遍历过程中安全地修改集合。 总的来说,`HashMap`结合`Iterator`提供了一种灵活的方式来访问和操作键值对。...

    示例iterator使用及技巧

    #### 一、基本概念与使用方法 ##### 1. `Iterator`接口简介 `Iterator`接口定义了用于访问集合元素的方法,包括获取下一个元素、检查是否还有更多元素以及移除当前元素等操作。在Java中,所有实现了`Iterable`接口...

    使用Iterator接口遍历集合元素

    2. 当使用 Iterator 来迭代访问 Collection 集合元素时,Collection 集合里的元素不能被改变,只有通过 Iterator 的 remove 方法来删除上一次 next 方法返回的集合元素才可以。否则将会引发 java.util....

    Java源码分析:深入探讨Iterator模式

    ### Java源码分析:深入探讨Iterator模式 #### 一、引言 在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式...

    struts2中iterator 标签的使用详解

    在Struts2框架中,`&lt;s:iterator&gt;`标签是一个非常强大的工具,用于在JSP页面上循环遍历集合数据,如列表(List)、数组、Map等。它允许开发者以一种动态且灵活的方式展示来自后端的数据,从而极大地提高了开发效率和...

    struts2 标签iterator使用

    通过本文档提供的代码示例,我们将深入探讨`&lt;s:iterator&gt;`标签的使用方法及其与不同数据类型(如简单对象、列表、数组)的交互方式。 ### 一、`&lt;s:iterator&gt;`标签的基本用法 `&lt;s:iterator&gt;`标签允许你在JSP页面上...

    Collection、Map、List、Set、Iterator

    ### Collection、Map、List、Set、...以上就是关于 `Collection`、`Map`、`List`、`Set` 和 `Iterator` 的详细解析,这些概念和类是 Java 编程中非常基础且重要的部分,掌握它们有助于更好地理解和使用 Java 集合框架。

    java Iterator迭代器的使用

    要使用`Iterator`,首先需要通过调用集合类的`iterator()`方法来获取迭代器实例。例如,对于ArrayList,代码可能如下所示: ```java ArrayList&lt;String&gt; list = new ArrayList(); // 添加元素... Iterator...

Global site tag (gtag.js) - Google Analytics