什么是 Java 中的迭代器(Iterator)?
Java 中的迭代器Iterator是一种设计模式用于遍历集合中的元素而不需要暴露集合的内部结构。它是 Java 集合框架的核心组件之一。基本概念Iterator 接口Iterator是一个接口位于java.util包中提供了统一的方式来遍历各种集合。publicinterfaceIteratorE{booleanhasNext();// 判断是否还有下一个元素Enext();// 返回下一个元素defaultvoidremove(){}// 删除当前元素可选操作defaultvoidforEachRemaining(Consumer?superEaction){}// Java 8 新增}基本用法1.创建和使用迭代器ListStringnamesArrays.asList(张三,李四,王五);// 获取迭代器IteratorStringiteratornames.iterator();// 遍历元素while(iterator.hasNext()){Stringnameiterator.next();System.out.println(name);}2.for-each 循环语法糖ListStringnamesArrays.asList(张三,李四,王五);// for-each 循环内部使用迭代器for(Stringname:names){System.out.println(name);}// 等价于上面的 while 循环主要方法详解1.hasNext() 和 next()ListIntegernumbersArrays.asList(1,2,3,4,5);IteratorIntegeriteratornumbers.iterator();while(iterator.hasNext()){Integernumiterator.next();System.out.println(当前元素: num);System.out.println(是否还有下一个: iterator.hasNext());}2.remove() 方法ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五,赵六));IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(name.equals(李四)){iterator.remove();// 安全删除当前元素}}System.out.println(names);// [张三, 王五, 赵六]重要注意事项remove()必须在调用next()之后调用每次调用next()只能调用一次remove()不是所有集合都支持remove()操作3.forEachRemaining() 方法Java 8ListStringnamesArrays.asList(张三,李四,王五);IteratorStringiteratornames.iterator();// 先跳过第一个元素if(iterator.hasNext()){iterator.next();}// 处理剩余元素iterator.forEachRemaining(name-System.out.println(剩余: name));迭代器 vs 其他遍历方式1.传统 for 循环ListStringnamesArrays.asList(张三,李四,王五);// 传统 for 循环for(inti0;inames.size();i){Stringnamenames.get(i);System.out.println(name);}// 优点可以访问索引// 缺点代码冗长只适用于 List2.for-each 循环ListStringnamesArrays.asList(张三,李四,王五);// for-each 循环for(Stringname:names){System.out.println(name);}// 优点简洁适用于所有集合// 缺点无法在遍历中删除元素3.迭代器ListStringnamesArrays.asList(张三,李四,王五);// 迭代器IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(name.equals(李四)){iterator.remove();// 可以安全删除}}// 优点可以安全删除元素适用于所有集合// 缺点代码相对冗长ListIteratorListIterator是Iterator的子接口专门用于 List 集合提供了双向遍历功能。ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五));ListIteratorStringlistIteratornames.listIterator();// 正向遍历System.out.println(正向遍历:);while(listIterator.hasNext()){intindexlistIterator.nextIndex();StringnamelistIterator.next();System.out.println(index: name);}// 反向遍历System.out.println(反向遍历:);while(listIterator.hasPrevious()){intindexlistIterator.previousIndex();StringnamelistIterator.previous();System.out.println(index: name);}// 添加元素listIterator.add(新元素);// 修改元素if(listIterator.hasNext()){listIterator.next();listIterator.set(修改后的元素);}实际应用场景1.安全删除元素ListIntegernumbersnewArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));// 删除偶数IteratorIntegeriteratornumbers.iterator();while(iterator.hasNext()){Integernumiterator.next();if(num%20){iterator.remove();// 安全删除}}System.out.println(numbers);// [1, 3, 5, 7, 9]2.过滤集合ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五,赵六,钱七));// 删除名字长度为2的元素IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(name.length()2){iterator.remove();}}System.out.println(names);// [张三, 李四, 王五, 赵六, 钱七]假设都是2个字3.自定义迭代器publicclassRangeimplementsIterableInteger{privateintstart;privateintend;publicRange(intstart,intend){this.startstart;this.endend;}OverridepublicIteratorIntegeriterator(){returnnewIteratorInteger(){privateintcurrentstart;OverridepublicbooleanhasNext(){returncurrentend;}OverridepublicIntegernext(){if(!hasNext()){thrownewNoSuchElementException();}returncurrent;}};}}// 使用自定义迭代器RangerangenewRange(1,5);for(intnum:range){System.out.println(num);// 1, 2, 3, 4, 5}4.处理嵌套集合ListListStringnestedListArrays.asList(Arrays.asList(A,B,C),Arrays.asList(D,E),Arrays.asList(F,G,H,I));// 使用迭代器处理嵌套结构IteratorListStringouterIteratornestedList.iterator();while(outerIterator.hasNext()){ListStringinnerListouterIterator.next();IteratorStringinnerIteratorinnerList.iterator();while(innerIterator.hasNext()){StringelementinnerIterator.next();System.out.print(element );}System.out.println();}并发修改异常问题示例ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五));// 错误在遍历时直接修改集合for(Stringname:names){if(name.equals(李四)){names.remove(name);// ConcurrentModificationException}}正确做法ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五));// 正确使用迭代器删除IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(name.equals(李四)){iterator.remove();// 安全删除}}Java 8 的替代方案1.Stream APIListStringnamesnewArrayList(Arrays.asList(张三,李四,王五,赵六));// 使用 Stream 过滤ListStringfilterednames.stream().filter(name-!name.equals(李四)).collect(Collectors.toList());System.out.println(filtered);// [张三, 王五, 赵六]2.removeIf 方法ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五,赵六));// 使用 removeIfnames.removeIf(name-name.equals(李四));System.out.println(names);// [张三, 王五, 赵六]3.forEach 方法ListStringnamesArrays.asList(张三,李四,王五);// 使用 forEachnames.forEach(name-System.out.println(name));// 使用方法引用names.forEach(System.out::println);性能考虑1.不同遍历方式的性能ListIntegerlargeListnewArrayList();for(inti0;i1000000;i){largeList.add(i);}// 传统 for 循环最快longstartSystem.currentTimeMillis();for(inti0;ilargeList.size();i){IntegernumlargeList.get(i);}System.out.println(传统 for: (System.currentTimeMillis()-start)ms);// 迭代器中等startSystem.currentTimeMillis();IteratorIntegeriteratorlargeList.iterator();while(iterator.hasNext()){Integernumiterator.next();}System.out.println(迭代器: (System.currentTimeMillis()-start)ms);// for-each与迭代器类似startSystem.currentTimeMillis();for(Integernum:largeList){// 使用 num}System.out.println(for-each: (System.currentTimeMillis()-start)ms);最佳实践✅ 推荐做法// 1. 简单遍历使用 for-eachListStringnamesArrays.asList(张三,李四,王五);for(Stringname:names){System.out.println(name);}// 2. 需要删除元素时使用迭代器IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(shouldRemove(name)){iterator.remove();}}// 3. Java 8 优先使用 Stream 或 removeIfnames.removeIf(name-shouldRemove(name));// 4. 需要索引时使用传统 for 循环for(inti0;inames.size();i){System.out.println(i: names.get(i));}❌ 避免的做法// 1. 避免在 for-each 中删除元素for(Stringname:names){names.remove(name);// ConcurrentModificationException}// 2. 避免多次调用 next() 而不检查 hasNext()IteratorStringiteratornames.iterator();Stringname1iterator.next();Stringname2iterator.next();// 可能抛出 NoSuchElementException// 3. 避免在不需要时使用迭代器// 简单遍历不需要迭代器的复杂性总结Java 迭代器的主要特点统一接口为所有集合提供统一的遍历方式安全删除可以在遍历过程中安全删除元素封装性不暴露集合的内部结构灵活性支持自定义迭代逻辑向后兼容支持旧版本的集合操作迭代器是 Java 集合框架的重要组件理解它有助于更好地处理集合遍历和修改操作。在现代 Java 中虽然 Stream API 提供了更强大的功能但迭代器仍然是处理某些场景的重要工具。

相关新闻

[AI提效-17]-豆包图片生成功能新手入门指南

[AI提效-17]-豆包图片生成功能新手入门指南

豆包图片生成功能是基于字节跳动Seed大模型研发的AI生成工具,核心作用是通过用户输入的文字描述(Prompt),快速生成符合预期的图片,无需专业设计功底,新手也能轻松上手,广泛适用于日常配图、创意…

2026/7/5 22:22:51 阅读更多 →
苏州智观易盛信息科技有限公司 Android 开发工程师职位深度解析与面试全攻略

苏州智观易盛信息科技有限公司 Android 开发工程师职位深度解析与面试全攻略

苏州智观易盛信息科技有限公司 Android安卓开发工程师 职位信息 岗位职责 1. 参与Android软件相关的需求调研和分析 2. 负责Android软件的设计、开发、测试和维护 3. 负责对已有Android软件的更新维护工作 4. 负责Android软件维护更新及开发中的技术文档编写 5. 完成上级分配的…

2026/7/3 22:42:36 阅读更多 →
【脑洞编程】从“治国理政”看懂C++广播机制:全局变量的“中央集权”与“局部自治”

【脑洞编程】从“治国理政”看懂C++广播机制:全局变量的“中央集权”与“局部自治”

告别枯燥的观察者模式!用“中央-地方”逻辑,讲透90%程序员都混淆的“数据传递”vs“信号广播” 文章正文(分6个部分,逻辑层层递进): 一、前言:为什么我们总搞不懂“广播机制”? 你是…

2026/7/6 18:17:57 阅读更多 →

最新新闻

Kafka 2.5.0 SASL/PLAIN 认证配置:3个关键配置文件与5步验证流程

Kafka 2.5.0 SASL/PLAIN 认证配置:3个关键配置文件与5步验证流程

Kafka 2.5.0 SASL/PLAIN 认证全流程实战指南在分布式消息系统中,安全认证是保障数据可靠传输的重要环节。本文将深入解析Kafka 2.5.0版本中SASL/PLAIN认证机制的完整配置流程,从原理到实践,帮助开发者和运维人员构建安全的Kafka消息通道。1. …

2026/7/7 9:12:28 阅读更多 →
SRWE:运行时窗口编辑器 - 突破游戏窗口限制的智能分辨率重塑工具

SRWE:运行时窗口编辑器 - 突破游戏窗口限制的智能分辨率重塑工具

SRWE:运行时窗口编辑器 - 突破游戏窗口限制的智能分辨率重塑工具 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE SRWE(Simple Runtime Window Editor) 是一款专为技术爱好者和…

2026/7/7 9:10:27 阅读更多 →
如何让《十字军之王II》完美显示中文:终极双字节补丁解决方案

如何让《十字军之王II》完美显示中文:终极双字节补丁解决方案

如何让《十字军之王II》完美显示中文:终极双字节补丁解决方案 【免费下载链接】CK2dll Crusader Kings II double byte patch /production : 3.3.4 /dev : 3.3.4 项目地址: https://gitcode.com/gh_mirrors/ck/CK2dll 还在为《十字军之王II》中无法正常显示中…

2026/7/7 9:08:27 阅读更多 →
Seedance2.5本地部署:免费AI生图与视频生成完整指南

Seedance2.5本地部署:免费AI生图与视频生成完整指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在寻找一款真正免费、无限制的AI生图和视频生成工具,那么Seedance2.5的本地部署版本绝对值得你花时间了解。与市面…

2026/7/7 9:06:26 阅读更多 →
美团酒店价格实时监控mtgsig1.2最新算法分析

美团酒店价格实时监控mtgsig1.2最新算法分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间点击头像看简介或…

2026/7/7 9:06:26 阅读更多 →
计算机毕业设计之jsp农产品扶贫惠农电商平台的设计与实现

计算机毕业设计之jsp农产品扶贫惠农电商平台的设计与实现

本毕业设计的内容是设计并且实现一个基于JSP技术的农产品扶贫惠农电商平台。它是在Windows下,以MYSQL为数据库开发平台,Tomcat网络信息服务作为应用服务器。农产品扶贫惠农电商平台的功能已基本实现,主要包括用户、商家、农户、产品分类、商品…

2026/7/7 9:04:26 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻