iterator 不支持双向遍历,因其仅定义 hasnext()、next() 和 remove() 方法,无反向操作;listiterator 是其子接口,专用于 list,提供 hasprevious()、previous() 等双向及修改方法。

Java 中的 Iterator 本身**不支持双向遍历**,它只能单向向前(调用 next())。要实现双向遍历(既能往前也能往后),必须使用它的子接口 —— ListIterator。
为什么 Iterator 不能双向?
Iterator 接口只定义了三个核心方法:hasNext()、next() 和 remove(),没有提供“上一个元素”或“向前移动”的能力。这是设计使然,为的是保持通用性(适用于所有 Collection,包括非列表结构如 Set)。
ListIterator 是 Iterator 的增强版
ListIterator 继承自 Iterator,专用于 List 类型(如 ArrayList、LinkedList),额外提供了反向遍历和修改能力:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
hasPrevious():判断是否有前一个元素 -
previous():返回前一个元素,并将游标前移 -
nextIndex()和previousIndex():获取下一个/上一个元素的索引位置 -
set(E e):替换上次next()或previous()返回的元素 -
add(E e):在当前位置插入新元素(不影响当前游标逻辑)
如何获取并使用 ListIterator
不能直接 new,必须通过 List 实例的 listIterator() 方法获取:
-
list.listIterator():从头开始(游标初始在索引 0 之前) -
list.listIterator(int index):从指定索引位置开始(游标初始在该索引之前)
示例:
List<string> list = Arrays.asList("a", "b", "c");
ListIterator<string> lit = list.listIterator();
// 正向遍历
while (lit.hasNext()) {
System.out.print(lit.next() + " "); // 输出:a b c
}
System.out.println();
// 反向遍历(注意:此时游标已在末尾,可直接 previous)
while (lit.hasPrevious()) {
System.out.print(lit.previous() + " "); // 输出:c b a
}</string></string>
注意事项
-
ListIterator是List特有的,Set、Map等不支持 - 它不是线程安全的,多线程环境下需同步
- 调用
previous()前必须确保hasPrevious()为true,否则抛NoSuchElementException - 与
Iterator一样,遍历时用add()或set()修改是安全的;但用list.add()或list.remove()会触发ConcurrentModificationException
不复杂但容易忽略:记住 ListIterator 是唯一标准方式,别试图给普通 Iterator 强加反向逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










