Iterator 与 ListIterator:Java 集合框架中的遍历器比较

Iterator 与 ListIterator:Java 集合框架中的遍历器比较

  • 1、Iterator
    • 1.1 特点
  • 2、ListIterator
    • 2.1 特点
  • 3、Iterator 和 ListIterator 的区别
  • 4、示例
    • 4.1 使用 Iterator 遍历 Set
    • 4.2 使用 ListIterator 遍历 List 并修改
  • 5、总结


💖The Begin💖点点关注,收藏不迷路💖

在Java的集合框架中,遍历集合元素通常有两种主要的遍历器:IteratorListIterator。尽管它们都是用于遍历集合的工具,但它们在功能和使用上存在一些关键的区别。

1、Iterator

Iterator 是Java集合框架中的一个核心接口,它允许我们遍历(即逐个访问)集合中的元素,而无需了解集合底层的实现细节。Iterator 接口的主要方法是:

  • hasNext():判断是否存在下一个元素。
  • next():返回集合中的下一个元素,并将迭代器的游标向前移动一位。
  • remove()(可选):删除迭代器最后返回的元素。

1.1 特点

  • 适用于任何实现了 Collection 接口的集合,包括 SetList
  • 只能进行前向遍历。
  • 不提供直接访问元素索引的方法。
  • 不允许在遍历过程中修改集合的结构(除了通过 remove() 方法删除当前元素外)。

2、ListIterator

ListIteratorIterator 的子接口,专为 List 集合设计。它除了继承 Iterator 的功能外,还提供了更多的操作来遍历和修改 List

ListIterator 接口的主要方法包括(除了 Iterator 的方法外):

  • hasPrevious():判断是否存在上一个元素。
  • previous():返回集合中的上一个元素,并将迭代器的游标向后移动一位。
  • add(E e):将元素插入到列表中,紧跟在迭代器的当前位置之前。
  • set(E e):用指定的元素替换通过 next()previous() 返回的最后一个元素。
  • nextIndex()previousIndex():分别返回对 next()previous() 的下一个调用的索引。

2.1 特点

  • 专用于 List 集合的遍历和修改。
  • 既可以前向遍历也可以后向遍历。
  • 允许在遍历过程中添加、替换和删除元素。
  • 提供直接访问元素索引的方法。

3、Iterator 和 ListIterator 的区别

  1. 适用范围

    • Iterator:适用于任何实现了 Collection 接口的集合。
    • ListIterator:专为 List 集合设计,只能用于遍历和修改 List
  2. 遍历方向

    • Iterator:只能前向遍历。
    • ListIterator:既可以前向遍历也可以后向遍历。
  3. 修改功能

    • Iterator:仅提供了删除当前元素的功能。
    • ListIterator:提供了添加、替换和删除元素的功能。
  4. 索引访问

    • Iterator:不提供直接访问元素索引的方法。
    • ListIterator:提供了直接访问元素索引的方法。

4、示例

4.1 使用 Iterator 遍历 Set

Set<String> set = new HashSet<>();  
set.add("A");  
set.add("B");  
set.add("C");  Iterator<String> iterator = set.iterator();  
while (iterator.hasNext()) {  String element = iterator.next();  System.out.println(element);  
}

4.2 使用 ListIterator 遍历 List 并修改

List<String> list = new ArrayList<>();  
list.add("A");  
list.add("B");  
list.add("C");  ListIterator<String> listIterator = list.iterator();  
while (listIterator.hasNext()) {  String element = listIterator.next();  System.out.println(element);  // 假设我们想要替换第一个元素  if (listIterator.nextIndex() == 1) {  listIterator.set("X"); // 将 "B" 替换为 "X"  }  
}  // 打印修改后的列表  
for (String s : list) {  System.out.println(s); // 输出: A X C  
}

5、总结

Iterator 和 ListIterator 都是在Java集合框架中用于遍历集合的重要工具。选择哪一个取决于你的具体需求:

1、如果你只需要遍历集合,并且不关心元素的索引或修改集合,那么 Iterator 就足够了;

2、如果你需要遍历 List 集合,并且希望在遍历过程中添加、替换或删除元素,那么 ListIterator 是更好的选择。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3247828.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

智慧农业新纪元:解锁新质生产力,加速产业数字化转型

粮食安全乃国家之根本&#xff0c;“浙江作为农业强省、粮食生产重要省份&#xff0c;在维护国家粮食安全大局中肩负着重大使命。浙江粮食产业经济年总产值已突破4800亿元&#xff0c;稳居全国前列&#xff0c;然而&#xff0c;同样面临着规模大而不强、质量效益有待提升、数字…

全网超详细客户端连接Redis

使用官方Redis Insight&#xff08;不支持中文&#xff09; 下载地址 https://redis.io/insight/ RedisInsight - The Best Redis GUI 下载信息可随便填写 添加redis 点击链接

艺术与技术的交响曲:CSS绘图的艺术与实践

在前端开发的世界里&#xff0c;CSS&#xff08;层叠样式表&#xff09;作为网页布局和样式的基石&#xff0c;其功能早已超越了简单的颜色和间距设置。近年来&#xff0c;随着CSS3的普及&#xff0c;开发者们开始探索CSS在图形绘制方面的潜力&#xff0c;用纯粹的代码创造出令…

Kafka 高并发设计之数据压缩与批量消息处理

《Kafka 高性能架构设计 7 大秘诀》专栏第 6 章。 压缩&#xff0c;是一种用时间换空间的 trade-off 思想&#xff0c;用 CPU 的时间去换磁盘或者网络 I/O 传输量&#xff0c;用较小的 CPU 开销来换取更具性价比的磁盘占用和更少的网络 I/O 传输。 Kafka 是一个高吞吐量、可扩展…

【PostgreSQL】PostgreSQL简史

博主介绍&#xff1a;✌全网粉丝20W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

【教学类-67-04】20240718毛毛虫ABC排序

背景需求 【教学类-67-01】20240715毛毛虫AB排序-CSDN博客文章浏览阅读747次&#xff0c;点赞17次&#xff0c;收藏8次。【教学类-67-01】20240715毛毛虫AB排序https://blog.csdn.net/reasonsummer/article/details/140443310【教学类-67-02】20240716毛毛虫ABB排序-CSDN博客文…

Atcoder ABC351 A-E 题解

A: 打卡题 题目描述 一中队和二中队正在进行一场棒球比赛&#xff0c;一中队是第一棒。 目前&#xff0c;比赛已进行到第九局上半&#xff0c;第九局下半即将开始。 一中队在 第i局 (1 < i < 9) 上半场得到了 Ai 分&#xff0c;二中队在 第j局 (1 < j < 8) 下…

数据结构之跳表SkipList、ConcurrentSkipListMap

概述 SkipList&#xff0c;跳表&#xff0c;跳跃表&#xff0c;在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中&#xff0c;跳跃表使用概率均衡技术而不是使用强制性均衡&#xff0c;因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。 Skip lis…

2-37 基于matlab的IMU姿态解算

基于matlab的IMU姿态解算,姿态类型为四元数&#xff1b;角速度和线加速度的类型为三维向量。IMU全称是惯性导航系统&#xff0c;主要元件有陀螺仪、加速度计和磁力计。其中陀螺仪可以得到各个轴的加速度&#xff0c;而加速度计能得到x&#xff0c;y&#xff0c;z方向的加速度&a…

云计算数据中心(三)

目录 四、自动化管理&#xff08;一&#xff09;自动化管理的特征&#xff08;二&#xff09;自动化管理实现阶段&#xff08;三&#xff09;Facebook自动化管理 五、容灾备份&#xff08;一&#xff09;容灾系统的等级标准&#xff08;二&#xff09;容灾备份的关键技术&#…

NXP i.MX8系列平台开发讲解 - 3.19 Linux TTY子系统(二)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. Linux 串口驱动 1.1 Uart 驱动注册流程 1.2 uart 操作函数 1.3 line discipline 2. Linux tty应用层使用…

Windows安装部署MySQL8.0

1.版本及下载 1.版本介绍&#xff1a; Alpha 版&#xff1a;开发版&#xff0c;公司内部使用 Beta 版&#xff1a;完成开发后&#xff0c;用户体验版 RC 版&#xff1a;生产环境发布之前的一个小版本或称候选版 GA 版&#xff1a;正式发布版本&#xff08;咱们要用的&…

代码随想录算法训练营Day26 | 491.递增子序列 | 46.全排列 | 47.全排列 II | 332.重新安排行程 | 51.N皇后 | 37.解数独

今日任务 491.递增子序列 题目链接&#xff1a; https://leetcode.cn/problems/non-decreasing-subsequences/description/题目描述&#xff1a; Code class Solution { public:vector<vector<int>> findSubsequences(vector<int>& nums) {vector&l…

SSE(Server Sent Event)实战(2)- Spring MVC 实现

一、服务端实现 使用 RestController 注解创建一个控制器类&#xff08;Controller&#xff09; 创建一个方法来创建一个客户端连接&#xff0c;它返回一个 SseEmitter&#xff0c;处理 GET 请求并产生&#xff08;produces&#xff09;文本/事件流 (text/event-stream) 创建…

leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法后序遍历

leetcode145. 二叉树的后序遍历&#xff0c;递归法迭代法 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#…

vue、js截取视频任意一帧图片

html有本地上传替换部分&#xff0c;可以不看 原理&#xff1a;通过video标签对视频进行加载&#xff0c;随后使用canvas对截取的视频帧生成需要的图片 <template> <el-row :gutter"18" class"preview-video"><h4>视频预览<span&…

LabVIEW电路产品功能自动检测系统

开发基于LabVIEW的电路产品功能自动检测系统。该系统通过整合先进的硬件和软件技术&#xff0c;实现了电路产品的自动化测试&#xff0c;显著提高了测试效率和准确性&#xff0c;对于提升电子产品的可靠性和工作效率具有重要意义。 项目背景 在电子制造业中&#xff0c;电路产…

PyCharm查看文件或代码变更记录

背景&#xff1a; Mac笔记本上有一个截图的定时任务在运行&#xff0c;本地Python使用的是PyCharm IDE&#xff0c;负责的同事休假&#xff0c;然后定时任务运行的结果不符合预期&#xff0c;一下子不知道问题出现在哪里。 定位思路&#xff1a; 1、先确认网络、账号等基本的…

git使用以及理解

git练习网站 Learn Git Branching git操作大全Oh Shit, Git!?! git commit git branch name git merge bugFix 合并俩个分支 git rebase main git checkout headgit switch head 会导致HEAD分离 &#xff0c;就是指head->HEAD->c1 相对引用 ------------------- …

测试面试宝典(十四)—— 你觉得软件测试的核心竞争力是什么?

回答一&#xff1a; 软件测试的核心竞争力在于其能够保障软件产品的质量和可靠性。 首先&#xff0c;测试人员需要具备敏锐的观察力和细致入微的分析能力&#xff0c;能够在复杂的系统中发现潜在的缺陷和问题。例如&#xff0c;在测试一款电商平台时&#xff0c;不仅要关注订…