尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Java ListIterator 接口详解:双向遍历与列表修改的利器
1. 引言在 Java 集合框架中Iterator是遍历集合元素的标准接口但它有一个明显的局限——只能单向遍历。当我们需要在遍历过程中反向移动、获取上一个元素或在遍历时安全地修改列表时Iterator就显得力不从心了。ListIterator接口正是为解决这些问题而生。它是Iterator的子接口专门为List系列集合如ArrayList、LinkedList提供双向遍历和列表修改的能力。本文将深入剖析ListIterator的源码设计、核心方法、使用场景与注意事项帮助你彻底掌握这一利器。2. ListIterator 接口概览2.1 接口定义ListIterator位于java.util包中其接口定义如下publicinterfaceListIteratorEextendsIteratorE{// 查询操作booleanhasNext();Enext();booleanhasPrevious();Eprevious();intnextIndex();intpreviousIndex();// 修改操作voidremove();voidset(Ee);voidadd(Ee);}2.2 与 Iterator 的关系ListIterator继承了Iterator的全部方法hasNext、next、remove并在此基础上扩展了 6 个新方法。它只能用于List及其子类而Iterator可以用于所有Collection。特性IteratorListIterator遍历方向单向向后双向向前/向后获取前一个元素不支持支持previous()获取索引不支持支持nextIndex()/previousIndex()修改元素仅支持删除支持删除、替换、新增适用集合所有 Collection仅 List3. 核心方法详解3.1 双向遍历方法ListIterator最核心的特性就是双向遍历。与Iterator只能通过next()向后移动不同ListIterator可以通过previous()向前移动。ListStringlistnewArrayList(Arrays.asList(A,B,C,D));ListIteratorStringitlist.listIterator();// 向后遍历System.out.println(向后遍历);while(it.hasNext()){System.out.print(it.next() );}// 输出A B C D// 此时迭代器位于列表末尾可以向前遍历System.out.println(\n向前遍历);while(it.hasPrevious()){System.out.print(it.previous() );}// 输出D C B A3.2 索引访问方法nextIndex()返回下一次调用next()将返回的元素的索引previousIndex()返回下一次调用previous()将返回的元素的索引。这两个方法在需要定位操作时非常有用。ListStringlistnewArrayList(Arrays.asList(A,B,C));ListIteratorStringitlist.listIterator();System.out.println(nextIndex: it.nextIndex());// 0System.out.println(previousIndex: it.previousIndex());// -1it.next();// 移动到 ASystem.out.println(nextIndex: it.nextIndex());// 1System.out.println(previousIndex: it.previousIndex());// 03.3 修改方法set 与 addset(E e)用于替换最近一次由next()或previous()返回的元素add(E e)用于在当前迭代位置插入新元素。ListStringlistnewArrayList(Arrays.asList(A,B,C));ListIteratorStringitlist.listIterator();it.next();// 指向 Ait.set(X);// 将 A 替换为 XSystem.out.println(list);// [X, B, C]it.add(Y);// 在 X 之后插入 YSystem.out.println(list);// [X, Y, B, C]4. 获取 ListIterator 的三种方式List接口提供了三种获取ListIterator的方法各有适用场景ListStringlistnewArrayList(Arrays.asList(A,B,C));// 方式一从列表头部开始ListIteratorStringit1list.listIterator();// 方式二从指定索引开始ListIteratorStringit2list.listIterator(1);// 从索引 1元素 B开始// 方式三从列表尾部开始通过 listIterator(size)ListIteratorStringit3list.listIterator(list.size());// 从末尾开始可向前遍历5. 实战案例5.1 反向遍历列表ListIntegernumbersnewArrayList(Arrays.asList(1,2,3,4,5));// 从末尾获取迭代器实现反向遍历ListIteratorIntegeritnumbers.listIterator(numbers.size());System.out.print(反向遍历);while(it.hasPrevious()){System.out.print(it.previous() );}// 输出5 4 3 2 15.2 遍历时安全地替换元素ListIntegernumbersnewArrayList(Arrays.asList(1,2,3,4,5));ListIteratorIntegeritnumbers.listIterator();while(it.hasNext()){intnumit.next();if(num%20){it.set(num*10);// 将偶数放大 10 倍}}System.out.println(numbers);// [1, 20, 3, 40, 5]5.3 在指定位置插入元素ListStringlistnewArrayList(Arrays.asList(A,C));ListIteratorStringitlist.listIterator();it.next();// 指向 Ait.add(B);// 在 A 之后插入 BSystem.out.println(list);// [A, B, C]6. 注意事项与常见陷阱6.1 并发修改异常与Iterator一样在使用ListIterator遍历时如果通过非迭代器方式如list.add()、list.remove()修改列表会抛出ConcurrentModificationException。ListStringlistnewArrayList(Arrays.asList(A,B,C));ListIteratorStringitlist.listIterator();while(it.hasNext()){Stringsit.next();if(s.equals(B)){list.remove(B);// 错误应使用 it.remove()}}// 抛出 ConcurrentModificationException6.2 set 与 remove 的调用限制set和remove方法都要求最近一次调用必须是next()或previous()。如果先调用了add()再调用set()或remove()会抛出IllegalStateException。ListStringlistnewArrayList(Arrays.asList(A,B));ListIteratorStringitlist.listIterator();it.next();// 合法it.add(X);// 插入后迭代器状态改变it.set(Y);// 抛出 IllegalStateException6.3 add 方法对迭代器位置的影响调用add()后新元素被插入到迭代器当前位置之前且next()返回的元素不变但previous()会返回新插入的元素。ListStringlistnewArrayList(Arrays.asList(A,C));ListIteratorStringitlist.listIterator();it.next();// 返回 Ait.add(B);// 插入 BSystem.out.println(it.previous());// 返回 BSystem.out.println(it.next());// 返回 C7. 源码视角ArrayList 中的 ListIterator 实现以ArrayList为例其内部类ListItr实现了ListIterator接口。核心字段包括privateclassListItrextendsItrimplementsListIteratorE{// 游标位置即下一个 next() 返回元素的索引privateintcursor;// 最近一次返回元素的索引-1 表示没有privateintlastRet-1;// 期望的修改次数用于快速失败检测privateintexpectedModCountmodCount;}add方法的实现体现了其位置语义publicvoidadd(Ee){checkForComodification();try{inticursor;ArrayList.this.add(i,e);// 在游标位置插入cursori1;// 游标后移lastRet-1;// 重置 lastRetexpectedModCountmodCount;}catch(IndexOutOfBoundsExceptionex){thrownewConcurrentModificationException();}}8. 总结ListIterator是 Java 集合框架中一个功能强大的接口它弥补了Iterator单向遍历的不足提供了双向遍历、索引访问和列表修改三大核心能力。在实际开发中当你需要反向遍历列表、在遍历时替换或插入元素时ListIterator是最佳选择。掌握ListIterator的关键在于理解其游标语义next()与previous()如何移动游标、set()与remove()的调用前提、以及add()对游标位置的影响。希望本文能帮助你更好地理解和使用这一接口写出更优雅、更高效的 Java 代码。
RELATED

相关推荐

Hermes库:快速构建可嵌入应用的AI Agent实践指南

Hermes库:快速构建可嵌入应用的AI Agent实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/10 14:06:24
LLM tracer实战:为什么93%测试覆盖率仍不够用?

LLM tracer实战:为什么93%测试覆盖率仍不够用?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/27 11:32:54
搭建腾讯云Linux环境!新手照样玩转服务器

搭建腾讯云Linux环境!新手照样玩转服务器

前言:为什么学Linux? 在软件开发领域,Linux早已不是“极客专属”的操作系统。无论是Web服务器、云计算基础设施,还是嵌入式设备、容器化部署,Linux都占据着统治地位。对于开发者而言,掌握Linux基础操作已成…

📅 2026/9/10 19:36:08
MORE NEWS

更多资讯

📰

工地太忙根本没时间复习考试?彬县电工证报名2026河南最新政策来了

工地太忙根本没时间复习考试?彬县电工证报名2026河南最新政策来了 工地太忙根本没时间复习考试,你不是一个人。尤其是在2026年河南最新政策下, 彬县电工证报名…

📰

建筑电工证是哪里发报名费多少钱

低学历也能考建筑电工证?真实经历告诉你答案 学历不高怕报不上名?别急,我来给你说说【建筑电工证是哪里发】的真相,看看别人怎么靠这个证翻身的。 建筑电工证到底是谁发的?河南老哥的真实经历…

📰

南平市电工证真伪查询怎么操作?全国通用的证书还能用多久?

南平市电工证真伪查询怎么操作?全国通用的证书还能用多久? 证书过期了不知道怎么复审延期?别慌,南平市电工证真伪查询其实并不复杂,但很多人因为不了解流程和政策,导致证书失效后才意识到问题。特别是现在, 全国通用…

📰

电工证可以在哪里考千万别踩坑 老电工教你避坑不花冤枉钱

电工证可以在哪里考千万别踩坑 老电工教你避坑不花冤枉钱 怕考不过白交培训费?别再被那些“包过班”忽悠了,电工证考试没那么简单。现在很多人找培训机构报名,结果花了几千块,培训几天就匆匆考试,最后还是挂科,还得重交钱重报班。 千万别踩坑…

📰

电工证怎么考潮汕地区 上岗必备全流程实操指南

电工证怎么考潮汕地区 上岗必备全流程实操指南 工地太忙根本没时间复习考试,你是不是也这样?手上活儿干不完,脑子里却总想着电工证怎么考潮汕地区,怕错过上岗必备的资格,更怕耽误了工期。其实,考证这件事并不难,关键是你得知道怎么在忙碌中高效完成流…

📰

电工证年审资料有哪些 你别被中介忽悠了 这些细节关系到含金量

电工证年审资料有哪些 你别被中介忽悠了 这些细节关系到含金量 你是不是也这样?想考个电工证,又怕被中介坑,不知道从哪报名,更不知道年审需要哪些资料,生怕因为资料不全耽误了工作?别急,今天就给你讲清楚,从报名到年审,再到含金量到底体现在哪,一…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬