Iterator remove()详解

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

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

wKioL1XwANyyvfvxAAAlGGiK240164.jpg

     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

目录
相关文章
|
前端开发 Java 测试技术
基于Spring boot的图书馆图书借阅管理系统的设计与实现
基于Spring boot的图书馆图书借阅管理系统的设计与实现
4520 0
|
Web App开发 移动开发 监控
100多个经典常用的网站模板大全实例演示和下载
推荐模板 /Template 11-07 二当家的网站后台模板源码 08-29 黑色技术微博客响应式模板 08-22 html5绿色通用的APP页面下载 08-07 绿色大...
8479 0
|
传感器
基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真
本课题基于SVPWM矢量控制,构建无速度传感器电机控制系统Simulink模型,涵盖电机、SVPWM模块及矢量控制器。通过电流闭环反馈实现精确磁场定向和转矩控制,利用SVPWM生成高精度调制波形,适用于永磁同步电机(PMSM)。系统无需物理速度传感器,通过电压和电流反馈估计电机速度,广泛应用于电动车驱动、工业自动化等领域。模型版本:MATLAB2022a。
|
SQL 人工智能 Java
mybatis-plus配置sql拦截器实现完整sql打印
_shigen_ 博主分享了如何在MyBatis-Plus中打印完整SQL,包括更新和查询操作。默认日志打印的SQL用?代替参数,但通过自定义`SqlInterceptor`可以显示详细信息。代码示例展示了拦截器如何替换?以显示实际参数,并计算执行时间。配置中添加拦截器以启用此功能。文章提到了分页查询时的限制,以及对AI在编程辅助方面的思考。
3408 5
mybatis-plus配置sql拦截器实现完整sql打印
|
网络协议 网络安全 网络虚拟化
神州数码DCN学习笔记(一)
文章主要介绍了交换机的基本配置和操作,包括用户模式、特权模式、全局配置模式、接口配置模式和VLAN配置模式等。详细列出了常用的命令及其功能,并通过例题展示了如何配置VLAN和远程管理交换机。
460 1
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
数据采集 缓存 算法
算法优化的常见策略有哪些
【10月更文挑战第20天】算法优化的常见策略有哪些
|
Java 数据库连接 数据库
实时计算 Flink版操作报错合集之flink jdbc写入数据时,长时间没写入后报错,是什么原因导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
1057 9
|
JSON Java API
实战 | JAVA读取WORD,包含表格。
我们有这样一个需求,需要抽取出WORD文档中的内容,然后组装成特定的json格式发送给第三方引擎接口
2307 0

热门文章

最新文章