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的更多相关文章

  1. Java中的集合(十四) Map的实现类LinkedHashMap

    Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...

  2. Java中的集合(十二) 实现Map接口的WeakHashMap

    Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...

  3. Java中的集合(五)继承Collection的List接口

    Java中的集合(五)继承Collection的List接口 一.List接口简介 List是有序的Collection的,此接口能够精确的控制每个元素插入的位置.用户能够根据索引(元素在List接口 ...

  4. Java中的集合Collection、Iterator和Foreach用法(一)

    1.Java集合概述 在编程中,常常需要集中存放多个数据.当然我们可以使用数组来保存多个对象.但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数 ...

  5. Java 设计模式系列(十五)迭代器模式(Iterator)

    Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...

  6. 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结

    201871010105-曹玉中<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ ...

  7. Java中的集合(十三) 实现Map接口的Hashtable

    Java中的集合(十三) 实现Map接口的Hashtable 一.Hashtable简介 和HashMap一样,Hashtable采用“拉链法”实现一个哈希表,它存储的内容是键值对(key-value ...

  8. Java中的集合框架-Collection(二)

    上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...

  9. Java中的集合(十一) 实现Map接口的TreeMap

    Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...

随机推荐

  1. 一只简单的网络爬虫(基于linux C/C++)————主事件流程

    该爬虫的主事件流程大致如下: 1.获取命令行参数,执行相应操作 2.读取配置文件,解析得到各种设置 3.载入各种模块 4.种子入队,开启DNS解析线程(原始队列不为空时解析) 5.创建epoll,开启 ...

  2. muduo网络库源码学习————线程类

    muduo库里面的线程类是使用基于对象的编程思想,源码目录为muduo/base,如下所示: 线程类头文件: // Use of this source code is governed by a B ...

  3. Mysql 远程连接错误排查

    1. 测试本地与远程服务器端口能否连通 telnet  远程IP  端口号 telnet 192.168.1.1 3306 2.如果是在aliyun或者aws云服务器上自建数据库 2.1 在安全组里开 ...

  4. libevent(九)evhttp

    用libevent构建一个http server非常方便,可参考libevent(六)http server. 主要涉及的一个结构体是evhttp: struct evhttp { /* Next v ...

  5. java基础篇 之 super关键字的理解

    ​ 之前一直认为,super指向的是父类对象.到今天,仔细查询了资料,自己做了实验,确认这个结论是不对的.我们分一下几个点讨论下: super的作用: 第一种:用来访问父类被隐藏的成员变量 第二种:用 ...

  6. css实现文字相对于图片垂直居中

    一 要实现的样式,文字在图片的垂直居中位置 二 实现的代码: <style> .flag{ position: absolute; bottom: 0; width: 23rem; hei ...

  7. Pytorch使用分布式训练,单机多卡

    pytorch的并行分为模型并行.数据并行 左侧模型并行:是网络太大,一张卡存不了,那么拆分,然后进行模型并行训练. 右侧数据并行:多个显卡同时采用数据训练网络的副本. 一.模型并行 二.数据并行 数 ...

  8. C# Html转pdf文件

    using iTextSharp.text; using iTextSharp.text.pdf; using System; using System.Collections.Generic; us ...

  9. Java代码生成器多表配置优化,增加自定义实体功能

    目录 前言 多表配置优化 自定义实体 杂谈 结语 前言   最近利用零碎的时间对代码生成器做了进一步更新:优化多表配置模块,增加自定义实体功能,美化单表和多表配置的UI界面,修复用户反馈的若干bug, ...

  10. C# 数据操作系列 - 7. EF Core 导航属性配置

    在上一篇,大概介绍了Entity Framework Core关于关系映射的逻辑.在上一篇中留下了EF的外键映射没有说,也就是一对一,一对多,多对一,多对多的关系等.这一篇将为大家细细分析一下,如何设 ...