Java中的集合(十五) Iterator 和 ListIterator、Enumeration
Java中的集合(十五) Iterator 和 ListIterator、Enumeration
一、Iterator
(一)、简介
Iterator 是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。
(二)、常用API

实例:

(三)、特点
- 只能单向移动遍历。
- 迭代器在迭代期间可以从集合中移除元素(通过迭代器删除)。
- 不能在迭代时通过集合对象添加,删除元素。
(四)、相关问题
1、Iterator遍历时不可以删除、添加集合中的元素问题
集合对象创建迭代器时,迭代器维护了 expectedModCount 属性,该属性记录了集合的大小(modCount),当集合对象调用 add()、remove() 等有可能修改集合长度的方法时,modCount 修改了,而 expectedModCount 没有及时更新,就会抛出 ConcurrentModificationException 异常。
2、移除元素
iterator.remove()是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()方法,remove()方法只能被调用一次,如果违反这个规则将抛出 IllegalStateException 异常。
二、ListIterator
(一)、简介
ListIterator是一个功能更加强大的迭代器,它继承于 Iterator 接口,只能用于各种 List 集合类型及其子类的访问。可以通过调用 listIterator() 方法产生一个指向 List 集合的ListIterator,,还可以调用 listIterator(n) 方法创建一个一开始就指向列表索引为n的元素处的 ListIterator。
(二)、常用API

(三)、特点
- 支持双向遍历(正向 / 反向遍历)。
- 产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引。
- 提供丰富的API对集合的操作。
- 可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素。
- 可以使用set()方法替换它访问过的最后一个元素。
(四)、允许遍历时添加、删除和修改的问题
ListIterator在执行添加、删除等更新操作时,会同时更新 expectedModCount 和 modCount 属性。
三、迭代器遍历、删除图示
(一)、遍历

(二)、删除

四、Enumeration
(一)、简介
Enumeration(枚举器)接口的作用和 Iterator 类似,但是只提供了遍历Vector和Hashtable类型集合元素的功能,不支持元素的移除操作。
(二)、常用API

(三)、特点
- 只可以遍历 Vector 和 Hashtable类型的集合。
- 不支持fail-fast机制。
- 遍历速度比迭代器快。
五、Iterator和ListIterator的区别
- ListIterator有add()方法,可以向List中添加对象,而Iterator不能
- ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
- 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。
六、Iterator和Enumeration的区别
- 任何集合对象都可以使用Iterator遍历,Enumeration只能遍历 Vector 和 Hashtable 类型的集合对象。
- Enumeration只提供遍历的功能,Iterator不仅提供遍历,还可以执行删除操作。
- Iterator支持fail-fast机制,而Enumeration不支持。
Java中的集合(十五) Iterator 和 ListIterator、Enumeration的更多相关文章
- Java中的集合(十四) Map的实现类LinkedHashMap
Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...
- Java中的集合(十二) 实现Map接口的WeakHashMap
Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...
- Java中的集合(五)继承Collection的List接口
Java中的集合(五)继承Collection的List接口 一.List接口简介 List是有序的Collection的,此接口能够精确的控制每个元素插入的位置.用户能够根据索引(元素在List接口 ...
- Java中的集合Collection、Iterator和Foreach用法(一)
1.Java集合概述 在编程中,常常需要集中存放多个数据.当然我们可以使用数组来保存多个对象.但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数 ...
- Java 设计模式系列(十五)迭代器模式(Iterator)
Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...
- 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结
201871010105-曹玉中<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ ...
- Java中的集合(十三) 实现Map接口的Hashtable
Java中的集合(十三) 实现Map接口的Hashtable 一.Hashtable简介 和HashMap一样,Hashtable采用“拉链法”实现一个哈希表,它存储的内容是键值对(key-value ...
- Java中的集合框架-Collection(二)
上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...
- Java中的集合(十一) 实现Map接口的TreeMap
Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...
随机推荐
- 集训模拟赛-1-T1
最近学校网课跟得紧没时间写知识点,就拿题解凑个数(bushi 而且前两天我打着打着题解电脑就突然死机 幸运的是 我没有保存(微笑) 废话不多说 上题目! 城市攻击 (city) (256MB,1s) ...
- Java——枚举
枚举类简介: Java5新增了一个enum关键字(它与class.interface关键字的地位相同),用以定义枚举类.枚举类也是一种特殊的类,所以也具有和类相同的变量和方法,也可以定义自己的构造器. ...
- Spring mvc的基本配置及工作原理
1.spring mvc框架搭建 需求:在浏览器输入一个请求login.do,跳转到登录成功界面. 第一步,创建web项目,导入jar包 注意: 第二步,在web.xml中配置spring的核心监听器 ...
- Linux从error while loading shared libraries: libxxx.so.x 错误的常规解决思路看程序与动态库的关系
出现这类错误的原因通常是动态库无法被加载,本文介绍了常规的解决方案,适用多种情况: 创作不易,如果本文帮到了您: 如果本文帮到了您,请帮忙点个赞
- Openwrt:基于MT7628/MT7688的PWM驱动
前言 MT7628/MT7688的PWM驱动相关资料较少,官方的datasheet基本也是一堆寄存器,啃了许久,终于嚼出了味道.由于PWM存在IO口复用的问题,所以要提前配置好GPIO的工作方式,不然 ...
- 基于mykernel 2.0编写一个操作系统内核
一.配置mykernel 2.0,熟悉Linux内核的编译 1.实验环境:VMware 15 Pro,Ubuntu 18.04.4 2.配置环境 1)在电脑上先下载好以下两个文件,之后通过共享文件夹, ...
- 24款WordPress网站AI插件大盘点
------------恢复内容开始------------ 你想把AI(人工智能)技术和机器学习技术添加到自己的WordPress网站吗?本文中,我会分享24个利用AI技术和机器学习技术的WordP ...
- JDBC06 其他操作及批处理Batch
灵活指定SQL语句中的变量 -PreparedStatement 对存储过程进行调用 -CallableStatement 运用事务处理 -Transaction 批处理 -Batch -对于大量的批 ...
- [hdu4497]分解质因数
题意:求满足gcd(x,y,z)=G,lcm(x,y,z)=L的x,y,z的解的个数. 大致思路:首先如果L % G != 0那么无解,否则令u = L / G,问题变为,gcd(r,s,t)=1,l ...
- Spark2.4.5集群安装与本地开发
下载 官网地址:https://www.apache.org/dyn/closer.lua/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz 验证Java ...