`
james23dier
  • 浏览: 533184 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java iterator迭代集合类

阅读更多
转载一篇文章, 解决关于我刚刚写的iterator迭代arraylist中不能改变arraylist中内容的问题。 原因如下:


转:ConcurrentModificationException主要原因及处理方法
2007年04月18日 星期三 12:57
当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行,   java.util.ConcurrentModificationException 异常也将被抛出。

  Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。

  所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

  有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.

1 import java.util.*; 
2
3 public final class MyTest 
4 { 
5     private static HashMap p_mapList = new HashMap(2); 
6     private MyTest(){} 
7     public static void init(){ 
8         // If only there are more than one element in Map, 
9         // the ConcurrentModificationException will not be
10         // thrown.
11          p_mapList.put(new String("hello"),new String("world")); 
12          p_mapList.put(new String("goto"),new String("hell")); 
13      } 
14     public static void clear() throws Exception{ 
15          Iterator pTmpKeys = null; 
16          Long pTmpKeyLong; 
17          pTmpKeys = p_mapList.keySet().iterator(); 
18          String pCurKey = null; 
19          String pCurObj = null; 
20         while(pTmpKeys.hasNext()){ 
21              pCurKey = (String) pTmpKeys.next(); 
22              pCurObj = (String) p_mapList.get(pCurKey); 
23
24              p_mapList.put(pCurKey,null); 
25             // You can not remove element in Map object directly.
26             //p_mapList.remove(pCurKey);
27             // But you can remove current element by iterator itself.
28              pTmpKeys.remove(); 
29
30              System.out.println(pCurKey + " removed."); 
31          } 
32          System.out.println(p_mapList.size() +  
33                             " entries left after iterator."); 
34          pTmpKeys = null; 
35      } 
36     public static void main(String[] args) 
37                                  throws Exception{ 
38          MyTest.init(); 
39          MyTest.clear(); 
40      } 
41 } 
分享到:
评论

相关推荐

    java Iterator迭代器的使用

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

    Iterator迭代器讲解

    ### Iterator迭代器详解 #### 一、Iterator简介与概念 在Java编程语言中,`Iterator`接口是一个重要的组件,它提供了遍历集合的基本方法。`Iterator`的主要作用是在不暴露集合内部结构的情况下,顺序访问集合中的...

    java迭代器模式实现正反向遍历

    在Java编程语言中,迭代器模式(Iterator Pattern)是一种常用的设计模式,用于顺序访问集合对象中的元素,而无需暴露其底层表示。这种模式提供了一种方法来访问一个聚合对象的元素,而无需暴露该对象的内部结构。在...

    java常用的集合类 Iterator迭代器的使用 foreach循环 泛型 Collections、Arrays工具

    常用的集合类Iterator迭代器的使用foreach循环 泛型Collections、Arrays工具

    Map、Set、Iterator迭代详解

    ### Iterator迭代器详解 #### 1. Iterator接口介绍 `Iterator`接口提供了遍历`Collection`中元素的能力。它是一种设计模式,允许开发者遍历容器中的元素,而无需暴露容器底层的实现细节。 #### 2. Iterator接口的...

    如何实现java Iterator迭代器功能

    Java Iterator迭代器是Java集合框架中的一种重要组件,用于遍历集合中的元素。在Java中,Iterator接口是Java集合框架的核心组件之一,它提供了一种通用的方式来遍历集合中的元素。 在Java中,Iterator接口定义了三...

    Java编程Iterator迭代器设计原理及实现代码示例

    Iterator迭代器是Java编程中的一种常见数据结构,用于遍历集合中的元素。在Java中,Iterator迭代器是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素。那么Iterator迭代器的设计原理是什么呢?为什么定义...

    Java Iterator接口遍历单列集合迭代器原理详解

    Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程: 在调用Iterator的next方法时,迭代器...

    java集合类详解(set list ArrayList等java集合类详述)

    Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...

    Java集合Iterator迭代的实现方法

    Java集合框架中的迭代器(Iterator)是访问集合元素的主要方式,尤其在遍历各种集合类如ArrayList、LinkedList、HashSet等时。迭代器模式的核心思想是提供一个标准的接口,使得客户端代码无需关心集合的内部结构,仅...

    使用Iterator接口遍历集合元素

    Iterator 接口隐藏了各种 Collection 实现类的底层细节,向应用程序提供了遍历 Collection 集合元素的统一编程接口。 Iterator 接口定义了三个方法:boolean hasNext()、Object next() 和 void remove()。hasNext()...

    java 迭代及迭代器的小例子

    例如,在java.util.concurrent包中的ConcurrentLinkedQueue等线程安全的集合类,它们的迭代器是弱一致性(weakly consistent)的,这意味着迭代器不会抛出ConcurrentModificationException,但可能不反映对集合的...

    JAVA中的Iterator的用法

    `Collection`接口是所有集合类的根接口。它定义了一些基本的方法,包括添加元素、删除元素以及获取`Iterator`等。`Iterator`接口和`Collection`接口之间的关系十分紧密。 ##### 1. `Collection`的主要方法 - **`...

    自己实现java中Iterator(迭代器功能).docx

    在Java编程过程中,迭代器(`Iterator`)是一种常见的用于遍历集合元素的机制。它提供了访问集合元素的方式,而不暴露底层数据结构。对于学习或进阶Java编程而言,理解并能够自己实现迭代器是非常有益的。 #### ...

    java集合类演示源码

    集合类的框架为集合的实现者提供了大量的接口和抽象类,并对其中的某些机制给予了描述,例如,Iterator(迭代协议)。实现Comparable接口或Comparator接口,用户可以根据需要对集合中的元素进行排序。为了方便用户...

    2JAVA编程高级-集合类.pdf

    ### JAVA编程高级——集合类知识点详解 #### 一、Java中的集合类概述 在Java编程中,集合类是一个非常重要的概念,它主要用于存储和管理对象的集合。与数组相比,集合提供了更多的灵活性,例如动态调整大小的能力...

    【Java设计模式】(1)迭代器模式Iterator

    在Java中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等,通过Iterator接口实现对集合的遍历。 **迭代器模式的核心组件:** 1. **迭代器(Iterator)角色**:这是模式的核心,它定义了遍历元素的接口...

    java包装类集合类详解

    ### Java包装类与集合类详解 #### 包装类概述 在Java中,为了更好地处理基本数据类型(如`int`、`double`等),Java提供了八种包装类,每种包装类都将基本数据类型“封装”起来,使得基本类型也能拥有对象特性,并...

    IteratorPattern 迭代设计模式

    在文件名称“IteratorPattern01”中,我们可以推测这可能是一个关于迭代器模式的示例代码或教程,可能包含了如何创建迭代器接口、具体迭代器类、聚合接口以及具体聚合类的实现,通过具体的代码来展示如何使用迭代器...

    Java Map 集合类简介

    【Java Map 集合类简介】 在Java的`java.util`包中,集合类扮演着重要的角色,其中List和Map是最为常见的两种。List的实现例如ArrayList和Vector,它们都是可变大小的列表,适合存储和操作各种类型对象的序列。特别...

Global site tag (gtag.js) - Google Analytics