JAVA小知识22:迭代器iterator与列表迭代器ListIterator

一、迭代器

在 Java 中,迭代器是一个设计模式,用于遍历集合中的元素。Java 提供了 Iterator 接口来实现这一功能。迭代器的主要作用是提供一种通用的遍历集合的方法,而不需要了解集合的具体实现细节。

1.1、迭代器的特点

  • 统一接口:提供统一的遍历接口,可以对各种集合进行遍历而不需要了解其具体实现。
  • 无序性:迭代器返回元素的顺序由集合的具体实现决定。
  • 一次性使用:迭代器是一次性的,使用完毕后不能复用。
  • 动态修改支持:在迭代过程中,可以通过迭代器的 remove方法安全地移除元素,而不会引发并发修改异常。

1.2、迭代器的优缺点

优点
  • 统一遍历方式:提供了一种通用的方法来遍历各种类型的集合。
  • 隐藏实现细节:不需要了解集合的内部结构,只需使用迭代器的接口即可遍历集合。
  • 安全删除:可以在迭代过程中安全地删除元素,避免并发修改异常。
  • 增强的灵活性:可以在任何地方停止和恢复遍历。
缺点
  • 单向遍历:Iterator 只能单向遍历集合,不能反向遍历。
  • 一次性使用:迭代器只能使用一次,不能复用。如果需要再次遍历,需要重新获取新的迭代器。
  • 有限的修改操作:只能通过 remove方法删除元素,不能添加或修改元素。如果需要更复杂的修改操作,需要使用其他工具或方法。
  • 可能的并发问题:虽然迭代器本身是线程不安全的,在多线程环境下需要额外的同步措施来避免并发问题。

二、迭代器的使用

在这里插入图片描述

2.1、简单的使用:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 判断当前位置是否有元素
while(iterator.hasNext()) {
// 获取当前元素的值并且将迭代器移入下一个对象String next = iterator.next();System.out.println(next);
}

2.2、NoSuchElementException

看如下代码:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 判断当前位置是否有元素
while(iterator.hasNext()) {
// 获取当前元素的值并且将迭代器移入下一个对象String next = iterator.next();System.out.println(next);
}
// 再次获取一次元素iterator.next();

iterator.hasNext()判断当前位置没有元素,while循环以及结束后,此时如果再次调用iterator.next()获取当前元素,会报出NoSuchElementException:没有当前元素异常。

2.3、注意事项

  1. 迭代器迭代完毕之后,迭代器指针是不会复位的,会一直停留在最后一个元素的位置,如果需要再次遍历,就需要重新获取迭代器对象。
  2. 循环中只能使用一次next方法。如果使用了两次也会因为最后一次超出范围而报NoSuchElementException异常
  3. 迭代器遍历的时候不能使用集合的增加或者删除的方法。

2.4、remove:删除

注意事项中说到:迭代器遍历的时候不能使用集合的增加或者删除的方法,那迭代器不就成打印的了?那要他有啥用,别急,迭代器提供了一个删除的方法:remove( ),它能移除集合中由迭代器返回的最后一个元素。

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 判断当前位置是否有元素
while(iterator.hasNext()) {
// 获取当前元素的值并且将迭代器移入下一个对象String next = iterator.next();if(next.startsWith("a")) {iterator.remove();}
}
System.out.println(list);//[b, c]

2.5、增强for循环

以防有人不知道增强for循环,这里先给出一个例子:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
for (String s : list) {System.out.println(s);
}

为什么这里要讲增强for循环?因为增强for循环的底层就是迭代器iterator,同理,他有如下特点:

  • 有限的操作能力:无法在遍历过程中修改集合(如删除元素),否则会抛出 ConcurrentModificationException 异常。
  • 无法访问索引:增强 for 循环不提供访问当前元素索引的能力,如果需要索引,仍需使用传统的 for 循环。
  • 只读遍历:增强 for循环仅适用于遍历,不能在遍历过程中执行复杂的操作(如移除元素等)。

三、列表迭代器ListIterator

ListIterator 是 Java 提供的一个专门用于列表的数据结构(如 ArrayList、LinkedList)的迭代器接口,它是 Iterator 接口的子接口。与Iterator相比,ListIterator 提供了更丰富的遍历和操作列表的功能,包括双向遍历添加元素替换元素等。

3.1、成员方法

方法签名返回类型说明
boolean hasNext()boolean如果迭代器后面还有元素,返回 true
E next()E返回迭代器的下一个元素。
boolean hasPrevious()boolean如果迭代器前面还有元素,返回 true
E previous()E返回迭代器的前一个元素。
int nextIndex()int返回迭代器的下一个元素的索引。
int previousIndex()int返回迭代器的前一个元素的索引。
void remove()void移除迭代器返回的最后一个元素。
void set(E e)void用指定的元素替换迭代器返回的最后一个元素。
void add(E e)void在列表中插入指定的元素。

3.2、方法解释

对于上述方法,我们只需要了解到add(),set()即可

add()
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
ListIterator<String> iterator = list.listIterator();
// 判断当前位置是否有元素
while (iterator.hasNext()) {if("a".equals(iterator.next())){iterator.add("a1");}
}
System.out.println(list);//[a, a1, b, c]
set()
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
ListIterator<String> iterator = list.listIterator();
// 判断当前位置是否有元素
while (iterator.hasNext()) {if("a".equals(iterator.next())){iterator.set("a1");}
}
System.out.println(list);//[a1, b, c]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能测试、负载测试、压力测试、稳定性测试简单区分【超详细】

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 性能测试是一个总称&#xff0c;可细分为性能测试、负载测试、压力测试、稳定性测试。 性能测试…

超级微同城小程序源码系统 帮你轻松制作本地生活服务平台 带源码包+搭建部署教程

系统概述 "超级微同城小程序源码系统"基于主流的小程序开发框架&#xff0c;采用高效稳定的后端架构设计&#xff0c;旨在为用户提供一个包含信息发布、在线交易、社交互动等功能于一体的综合型本地生活服务平台。系统涵盖了餐饮外卖、生鲜配送、家政服务、二手交易…

入门机器视觉的正确打开方式——徒手撸一个python+opencv实现的机器视觉简易调试工具(上)

目录 1.引言2.框架思路3.环境搭建4.图像处理流程化的实现5.流水线上的算法块5.1 算法块的可视化 6.总结7.调试工具成品链接PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 1.引言 在当今AI时代&#xff0c;关于视觉识别似乎已被…

数据可视化:Seaborn

安装Seaborn 进入虚拟环境&#xff0c;在终端中键入 pip install seaborn 即可安装。 初步使用Seaborn 在使用seaborn之前&#xff0c;我们先了解一下seaborn是什么&#xff0c;seaborn是以matplotlib为底层的更简便的python第三方库&#xff0c;它可以更快捷地去设置图形的一…

关于el-date-picker组件,如何隐藏时间组件底部清空按钮

工作中可能会遇到el-date-picker组件隐藏时间组件底部清空按钮 分为两种 &#xff1a; 如果你想要实现全部的el-date-picker的清空隐藏 和 某一个页面的el-date-picker的清空隐藏 1 全局隐藏 步骤1&#xff1a;在element-ui.scss中添加如下代码&#xff1a; .el-picker-pane…

在VS Code中快速生成Vue模板的技巧

配置vue.json: { "Print to console": {"prefix": "vue","body": ["<template>"," <div class\"\">\n"," </div>","</template>\n","<scri…

操作系统入门 -- CPU调度算法

操作系统入门 – CPU调度算法 在了解完进程和线程的概念后&#xff0c;我们就需要了解当一个进程就绪后系统会进行怎样的资源分配并运行进程&#xff0c;因此我们就需要了解CPU的调度算法 1.CPU调度 1.1概念 CPU调度即按照某种算法将CPU资源分配给某个就绪的进程。 1.2调度…

大模型应用开发技术:Multi-Agent框架流程、源码及案例实战(二)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

Matlab r2023a v23.2.0 解锁版安装步骤 (工程计算商业数学软件)

前言 Matlab&#xff08;矩阵实验室&#xff09;是全球领先的数学计算软件开发商美国 MathWorks 公司研发的一款面向科学与工程计算的高级语言的商业数学软件&#xff0c;集算法开发、数据分析、可视化和数值计算于一体的编程环境&#xff0c;其核心是仿真交互式矩阵计算&…

买超声波清洗机什么牌子好?四大优越上品超声波清洗机总汇

随着生活品质提高&#xff0c;洗眼镜的方式是越来越多样化了&#xff01;传统的清洗眼镜方式非常容易导致眼镜损坏&#xff0c;从而缩短了眼镜原本的使用寿命&#xff01;因此超声波清洗机的出现就方便了大家&#xff0c;在清洗眼镜时&#xff0c;可以用超声波清洗机数分钟就搞…

基于WPF技术的换热站智能监控系统15--实时读取PLC数据

1、创建PLC实时数据 1、添加数据块 2、创建6个变量 用来表示水泵1和水泵2的参数&#xff0c;可以根据现场实际情况添加更多的变量参数 3、设置块属性并编译 4、下载该程序到PLC中 5、添加监控表 2、读取设备数据 S7协议下的tcp直接通讯&#xff0c;配置简单&#xff0c;一般P…

【Python】从0开始的Django基础

Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…

10KM无人机高清图传通信模组,低延迟、抗干扰,飞睿智能无线MESH组网模块

随着科技的飞速发展&#xff0c;无人机技术在各个领域的应用越来越广泛。尤其在海上监测、搜索救援、货物运输等场景中&#xff0c;无人机的应用显得尤为重要。然而&#xff0c;要实现无人机在复杂海域环境中的高效通信&#xff0c;高清图传通信模组的作用不可忽视。本文将深入…

【笔记】复制Edge的网址粘贴后自动变成中文标题超链接

问题 1、从edge复制的网址粘贴直接显示网页内容名称而不是网址url。 2、复制任何网址粘贴到CSDN里面粘贴时直接转换成标题超链接&#xff08;很讨厌的功能习惯&#xff09;。 而如上两种问题不是互相影响的&#xff0c;就算设置了Edge的粘贴方式&#xff0c;复制到CSDN的文章…

来自红队大佬的经验之谈---命令执行过滤绕过-Windows篇

感谢来自老流氓大佬的投稿&#xff0c;本次文章介绍的是在windows环境下&#xff0c;过滤的“点”和“空格”等符号&#xff0c;导致在写入webshell时会受限。以下是针对该目标的绕过记录。 首先是命令执行和过滤验证&#xff0c;如下&#xff1a;​ 执行dir命令&#xff0c;…

基于JSP的二手车交易网站

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对二手车交易网站感兴趣或有相关开发需求&#xff0c;欢迎随时联系我。我的联系方式可以在文末找到。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#…

微服务开发与实战Day10 - Redis面试篇

一、Redis主从集群 1. 搭建主从集群 1.1 主从集群结构 单节点Redis的并发能力是有限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 如图所示&#xff0c;集群中有一个master节点、两个slave节点&#xff08;现在叫re…

机械师电脑文件丢失怎么办?6个恢复方法,希望能帮到您

机械师电脑作为高性能的计算机品牌&#xff0c;受到众多用户的青睐。然而&#xff0c;即便是品质卓越的电脑&#xff0c;也难免会遇到文件丢失的困扰。无论是由于误操作、系统故障还是硬盘损坏&#xff0c;文件丢失都可能给用户带来不小的麻烦。当您发现机械师电脑上的文件突然…

海洋经济捧出一个IPO,宁波海上鲜数字化赋能背后的喜与忧

近日&#xff0c;宁波海上鲜信息技术股份有限公司&#xff08;下称“海上鲜”&#xff09;向港交所递交上市申请&#xff0c;国泰君安国际、东兴证券&#xff08;香港&#xff09;为其联席保荐人。贝多财经获悉&#xff0c;该公司自2022年5月起便开始筹备赴港上市&#xff0c;但…

怎么把两个音频合成一个?将两个音频合成一个的四种方法

怎么把两个音频合成一个&#xff1f;在当今数字化的时代&#xff0c;音频处理已经成为我们生活中不可或缺的一部分。有时候&#xff0c;我们会希望将两段音频合成为一个&#xff0c;无论是为了制作音乐混音、创作声音效果&#xff0c;还是为了编辑播客节目或视频配音。合成音频…