Iterator主要有三个方法:hasNext()、next()、remove()详解

一、Iterator的API

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

二、迭代器原理

1、当创建完成指向某个集合或者容器的Iterator对象时,这时的指针其实指向的是第一个元素的上方,即指向一个 空

2、当调用hasNext方法的时候,只是判断下一个元素的有无,并不移动指针

3、当调用next方法的时候,向下移动指针,并且返回指针指向的元素,如果指针指向的内存中没有元素,会报异 常。

4、remove方法删除的元素是指针指向的元素。如果当前指针指向的内存中没有元素,那么会抛出异常。

三、迭代器的用途

迭代器一般会用在遍历集合上面。

四、使用中注意的问题

Java中的Iterator是一种fail-fast的设计。当Iterator迭代一个容器的时候,如果此时有别的方法在更改Collection(容器)的内容,那么Iterator就会抛出ConcurrentModificationException 。正如官方文档中反复强调的:Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.为了避免此Exception的发生,可以采取的解决方法是:

1.如果当前单个线程在更改容器(add, delete…),那么迭代的时候采用iterator.remove()方法可以确保迭代器在查找next的时候,指针不会丢失。

while(iterator.hasNext() {Object item = iterator.next();iterator.remove();   //Important! 避免 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包下面的线程安全的容器解决此异常。

最后要说的是,ConcurrentModificationException应该永远被用于解决一个bug,而不是检查程序的正确性(try…catch…)。

Iterator主要有三个方法:hasNext()、next()、remove()详解相关推荐

  1. linux下没有yum命令,linux下配置yum的三种方法与yum命令详解

    (一).制作YUM本地源: YUM简介: YUM是Yellow dog Updater Modified的简称,yum是软件的仓库,它可以是http或ftp站点,也可以是本地软件池,但必须包含rpm的 ...

  2. 计算字符串长度的三种方法(库函数 指针 )【详解】

    目录 求字符串长度的一般原理 方法一:strlen函数 函数原型 使用方法 方法二:指针+整数 方法三:指针-指针 总结: 求字符串长度的一般原理 求字符串长度简单来说就是计算一个字符串(字符数组)中 ...

  3. java iterator remove_Iterator remove()详解

    一.Iterator的API 关于Iterator主要有三个方法:hasNext().next().remove() hasNext:没有指针下移操作,只是判断是否存在下一个元素 next:指针下移, ...

  4. mysql 获取当前整点_Oracle 生成未来三天的整点时间(步骤详解)

    需求:X坐标轴时间都为整点时间,展示未来三天内的预测(x轴展示未来三天的整点时间),每3个小时一个刻度,横坐标共计24个刻度 步骤一:取当前时间 SELECT SYSDATE FROM DUAL 步骤 ...

  5. Android异步处理三:Handler+Looper+MessageQueue深入详解

    本博文地址:http://blog.csdn.net/mylzc/article/details/6771331 转载请注明出处 Android异步处理系列文章索引 Android异步处理一:使用Th ...

  6. Android JNI使用方法,JNI机制详解

    Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...

  7. 主成分分析(PCA)方法步骤以及代码详解

    主成分分析(PCA)方法步骤以及代码详解 前言 上一节我们了解到在构建神经网络模型,除了掌握如何搭建神经网络架构,了解参数具体含义,规避风险等方法.第一步是要对采用数据集的详细了解,无需接触任何神经网 ...

  8. 白加黑加载方式_“白加黑减”即曝光补偿的应用方法及原理全面详解——致新手新新手...

    "白加黑减"即曝光补偿的应用方法及原理全面详解 --致新手新新手 本文对曝光补偿这一摄影基本技术及原理做一全面详细的分析和解释,旨在让受此困惑的新手能够从原理上彻底理解" ...

  9. 饥荒机器人怎么解锁_饥荒全人物解锁方法以及属性技能详解

    饥荒的原版游戏共有十余种人物供玩家们选择,每个角色属性技能不同,解锁条件也不同.下面小编就带来了饥荒全人物解锁方法及属性技能详解,一起来看看哪些角色适合玩耍吧. 第 5 页 机器人 机器人 英文名称: ...

最新文章

  1. 工作流引擎JFlow与activiti 对比分析(一)5种基本控制流模式的对比
  2. 替换RubyGems 镜像
  3. java 分布式编程,Java的并行、并发和分布式编程
  4. java开发五年面试经验_只有经验丰富的开发人员才能教您有关Java的5件事
  5. python学习之文件读写
  6. 史上最全Oracle文件损坏处理办法(附实验步骤)
  7. IDEA springboot maven 项目部署
  8. tar命令常见用法汇总
  9. 后缀–ize_常见词性后缀
  10. 深入理解 OC/C++ 闭包
  11. 智能家居雷声越来越大 雨点还是那么小
  12. 如何计算芯片的ESP mac 地址
  13. antd select.option选项加入额外属性
  14. 微服务大战:Spring启动大战。 Ballerina
  15. 树莓派html5播放器,QT+树莓派实现一个简单的播放器
  16. 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法
  17. aarch64 poky linux,aarch64-poky-linux-gcc:error::没有这样的文件或目录
  18. 计算机与音乐整合的教学设计,《音乐与诗歌的交融》教学设计
  19. 使用U盘将系统安装到Raid(磁盘阵列)上(出处http://hym.cublog.cn)
  20. 根据文件流下载表格数据Excel形式

热门文章

  1. Java Throwable initCause()方法与示例
  2. c# 情感倾向_C否则-能力倾向问题与解答
  3. php date( w ),PHP Date()函数详解
  4. c语言goto语句用法_C语言32个关键字9种控制语句34种运算符整理
  5. nodejs与javascript中的aes加密
  6. 不创建 sequence 自增字段
  7. linux——回射服务器多并发(多进程)
  8. 使用Bazel编译报错ERROR: Unrecognized option: --experimental_repo_remote_exec解决方法
  9. C#中其他简单LINQ查询表达式的简单使用介绍
  10. 域控制器安装完成没有_tcp_udp_究竟什么才叫域控制器?