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

目录
相关文章
|
Web App开发 移动开发 监控
100多个经典常用的网站模板大全实例演示和下载
推荐模板 /Template 11-07 二当家的网站后台模板源码 08-29 黑色技术微博客响应式模板 08-22 html5绿色通用的APP页面下载 08-07 绿色大...
8429 0
|
网络协议 固态存储 Windows
解决Win10服务主机本地系统网络受限
换成win10有一段时间了,界面风格比win7好看,但有部分程序还是不兼容,还好用虚拟机可以将就解决。但有一个问题一直困扰了我好久,今天终于解决了。 问题描述 在进程中,服务主机:本地系统(网络受限)的CPU使用率非常高,经常导致达到100%使电脑卡起,甚是恼火。
4218 0
|
传感器
基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真
本课题基于SVPWM矢量控制,构建无速度传感器电机控制系统Simulink模型,涵盖电机、SVPWM模块及矢量控制器。通过电流闭环反馈实现精确磁场定向和转矩控制,利用SVPWM生成高精度调制波形,适用于永磁同步电机(PMSM)。系统无需物理速度传感器,通过电压和电流反馈估计电机速度,广泛应用于电动车驱动、工业自动化等领域。模型版本:MATLAB2022a。
|
SQL 人工智能 Java
mybatis-plus配置sql拦截器实现完整sql打印
_shigen_ 博主分享了如何在MyBatis-Plus中打印完整SQL,包括更新和查询操作。默认日志打印的SQL用?代替参数,但通过自定义`SqlInterceptor`可以显示详细信息。代码示例展示了拦截器如何替换?以显示实际参数,并计算执行时间。配置中添加拦截器以启用此功能。文章提到了分页查询时的限制,以及对AI在编程辅助方面的思考。
3359 5
mybatis-plus配置sql拦截器实现完整sql打印
|
网络协议 网络安全 网络虚拟化
神州数码DCN学习笔记(一)
文章主要介绍了交换机的基本配置和操作,包括用户模式、特权模式、全局配置模式、接口配置模式和VLAN配置模式等。详细列出了常用的命令及其功能,并通过例题展示了如何配置VLAN和远程管理交换机。
441 1
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
数据采集 缓存 算法
算法优化的常见策略有哪些
【10月更文挑战第20天】算法优化的常见策略有哪些
|
JSON Java API
实战 | JAVA读取WORD,包含表格。
我们有这样一个需求,需要抽取出WORD文档中的内容,然后组装成特定的json格式发送给第三方引擎接口
2289 0
|
Java 测试技术
【Java】已解决java.lang.UnsupportedOperationException异常
【Java】已解决java.lang.UnsupportedOperationException异常
3081 0