Iterator remove()详解

一、Iterator的API
      关于Iterator主要有三个方法:hasNext()、next()、remove()
      hasNext:没有指针下移操作,只是判断是否存在下一个元素
      next:指针下移,返回该指针所指向的元素
     remove:删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素
二、迭代器原理
     

     1、当创建完成指向某个集合或者容器的Iterator对象是,这是的指针其实指向的是第一个元素的上方,即指向一个           空
     2、当调用hasNext方法的时候,只是判断下一个元素的有无,并不移动指针
     3、当调用next方法的时候,向下移动指针,并且返回指针指向的元素,如果指针指向的内存中没有元素,会报异常。
     4、remove方法删除的元素是指针指向的元素。如果当前指针指向的内存中没有元素,那么会抛出异常。

三、使用中注意的问题

Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则
 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

  
1.如果当前单个线程在更改容器(add, delete....),那么迭代的时候采用iterator.remove()方法可以确保迭代器在查找next的时候,指针不会丢失。
while(iterator.hasNext() {
     Object item = iterator.next();
     iterator.remove();   //避免ConcurrentModificationException
     ......
}

2.如果当前有多个线程在对容器进行操作,例如一个线程正在向容器中写数据,而另一个线程在迭代此容器,这时候就必须考虑并发下的线程安全问题。ConcurrentModificationException官方文档第一句就指出:
This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.
这时候可以采用java.util.concurrent包下面的线程安全的容器解决此异常。

参考文章:

http://blog.csdn.net/scyatcs/article/details/9003295

 

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1693218

时间: 2024-09-10 14:07:21

Iterator remove()详解的相关文章

C++中const 与 迭代器(iterator) 使用 详解

迭代器(iterator) 是一种指针类型, 也分const指针本身(地址) 和 const指针所指的值, 两种情况; 但是写法和const内置指针有所不同; char * const 相当于 const container<>::iterator; 可以修改指针所指的值, 但不能修改指针的地址; const char * 相当于 container<>::const_iterator; 可以修改指针地址, 但不能修改指针所指的值; 注意代码示例, 两种const和迭代器; 代码:

jQuery的remove()方法使用详解_jquery

remove()方法的定义和用法: 此方法将会从DOM中删除所有匹配的元素. 说明:remove()方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素,不过除了这个元素本身得以保留之外,其他的比如绑定的事件,附加的数据等都会被移除. 语法结构: $(selector).remove(expr) 参数列表: 参数 描述 expr 可选.用于筛选元素的jQuery表达式 实例代码: <!DOCTYPE html> <html> <head> &

EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6.x中不同,相同的则不再叙述. EntityFramework Core 1.1方法理论详解 当我们利用EF Core查询数据库时如果我们不显式关闭变更追踪的话,此时实体是被追踪的,关于变更追踪我们下节再叙.就像我们之前在EF 6.x中讨论的那样,不建议手动关闭变更追踪,对于有些特殊情况下,关闭变更追

Iterator、Iterable接口的使用及详解

Java集合类库将集合的接口与实现分离.同样的接口,可以有不同的实现. Java集合类的基本接口是Collection接口.而Collection接口必须继承java.lang.Iterable接口. 以下图表示集合框架的接口,java.lang以及java.util两个包里的.其他部分可以从左向右看,比如Collection的Subinterfaces有List,Set以及Queue等. package java.util; /** * An iterator over a collectio

JDOM使用详解及实例

dom|详解 一.JDOM 简介 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作. JDOM 直接为JAVA编程服务.它利用更为强有力的JAVA语言的诸多特性(方法重载.集合概念以及映射),把SAX和DOM的功能有效地结合起来. 在使用设计上尽可能地隐藏原来使用XML过程中的复杂性.利用JDOM处理XML文档将是一件轻松.简单的事. JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来,以弥补

Java NIO API详解

详解 在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API.对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO.从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供异步(non-blocking)IO操作的API被引入.本文对其进行深入的介绍. NIO API主要集中在java.nio和它的subpackages中: java.nio 定义了Buff

Java 23种设计模型详解_java

设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每

Java经典设计模式之十一种行为型模式(附实例和详解)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之五大创建型模式(附实例和详解). Java经典设计模式之七大结构型模式(附实例和详解). 行为型模式细分为如下11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式

详解Java编程中线程同步以及定时启动线程的方法_java

使用wait()与notify()实现线程间协作 1. wait()与notify()/notifyAll()调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁.这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中.可以通过notify()/notifyAll(),或者时间到期,从wait()中恢复执行. 只能在同步控制方法或同步块中调用wait().notify()和notifyAll().如果在非同步的方法里调用这些方法,在运