一、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包下面的线程安全的容器解决此异常。

参考文章:

java iterator remove_Iterator remove()详解相关推荐

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

    Iterator主要有三个方法:hasNext().next().remove()详解 一.Iterator的API 关于Iterator主要有三个方法:hasNext().next().remove ...

  2. Java Map集合的详解

    参考自:Java Map集合的详解 (略有修改) 一,Map 如果程序中存储了几百万个学生,而且经常需要使用学号来搜索某个学生,那么这个需求有效的数据结构就是Map. Map是一种依照键(key)存储 ...

  3. Java JUC学习 - ConcurrentLinkedDeque 详解

    Java JUC学习 - ConcurrentLinkedDeque 详解 0x00 前言 如何实现并发程序,对于Java以及其他高级语言来说都是一件并不容易的事情.在大一上学期的时候,我们学习了链表 ...

  4. 夯实JAVA基本之一 —— 泛型详解(1):基本使用

    前言:无论何时,相信自己. 相关文章: 1.<夯实JAVA基本之一 -- 泛型详解(1):基本使用> 2.<夯实JAVA基本之一--泛型详解(2):高级进阶> 3.<夯实 ...

  5. Java JUC并发编程详解

    Java JUC并发编程详解 1. JUC概述 1.1 JUC简介 1.2 进程与线程 1.2 并发与并行 1.3 用户线程和守护线程 2. Lock接口 2.1 Synchronized 2.2 什 ...

  6. Java单元测试之JUnit4详解

    2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...

  7. java -jar 和 -cp详解

    java -jar 和 -cp详解 命令行执行程序 假如我们有一个程序,把它打包成Test.jar,如何运行才能成功输出Hello World package com.test; public cla ...

  8. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

  9. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

最新文章

  1. swagger 使用指南
  2. transform.Normalize()用法+后面参数为什么用(0.5,0.5,0.5)(0.5,0.5,0.5)
  3. 学习ReasonML编程语言
  4. html获取url参数值,js获取url中参数值的两种方法
  5. 初学java andriod 软件安装与配置问题
  6. VS 母版使用配置技巧
  7. C# 的基本数据类型
  8. mysql监控 代码审计_Seay源代码审计系统2.1及源码开放 人人都是代码审计师
  9. LaTex实战笔记 3-宏包与控制命令
  10. 【魔方代码】1200行C语言代码实现“魔方”程序,学会它买魔方的钱都省了,拿走不谢~
  11. Android文件实现选择打开方式
  12. nacos开机启动报错找不到JAVA_HOME
  13. Python pywifi 、Kali linux aircrack-n、Hashcat 【python、kali】破解无线WiFi密码(详细流程)
  14. 白光干涉仪能做什么丨科普篇
  15. Cascade Classification
  16. 对比分析OSG与Cesium中模型LOD的异同
  17. PLC学习 20191229
  18. diskgeniuslinux版_DiskGenius
  19. 家电行业APS如何选型?
  20. java后端上传文件校验文件后缀

热门文章

  1. Django 省、市、区 三级联动 及数据库的地址添加 !!!
  2. 弘辽科技:淘宝店铺分类在哪里改?怎么调整分类?
  3. VMware安装Mac10.14OS并安装XCode开苹果模拟器调试过程
  4. JAVA里常见的命名规则和命名规范
  5. 水肥一体化如何实现灌溉自动化
  6. 企业级GIT分支管控方案
  7. docker三大核心概念
  8. AIX服务器(Unix系统)下安装gcc
  9. java override报错_java @override 报错处理
  10. word日期格式批量修改_如何设置Word中使用的默认短日期和长日期和时间格式