java中普通iterator不支持反向遍历,需用listiterator:调用listiterator(list.size())获取末尾指针,用hasprevious()和previous()实现while反向遍历,支持安全remove(),但仅适用于list类型。

Java 中的普通 Iterator 接口只支持单向(正向)遍历,无法直接反向遍历。要实现反向遍历,必须使用其子接口 ListIterator,它专为 List 类型设计,支持双向移动。
用 ListIterator 实现 while 反向遍历
核心思路是:将 ListIterator 的初始位置设在列表末尾,再通过 hasPrevious() 和 previous() 向前推进。
- 调用
list.listIterator(list.size())获取指向末尾的迭代器(指针位于最后一个元素之后) - 用
while (iterator.hasPrevious())判断前面是否还有元素 - 每次循环调用
iterator.previous()获取前一个元素并移动指针
支持边遍历边安全删除
与 for-each 或普通 for 循环不同,ListIterator 在反向遍历时也能安全调用 remove() 删除当前返回的元素,不会引发 ConcurrentModificationException。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 删除的是上一次
previous()返回的那个元素 - 必须在调用
previous()后、下一次previous()前执行remove() - 例如:遍历中过滤掉偶数,可直接在
if (x % 2 == 0) iterator.remove();中完成
注意 ListIterator 的适用范围
ListIterator 只能用于实现了 List 接口的集合(如 ArrayList、LinkedList),不适用于 Set 或 Map。
- 对
Map需反向处理时,应先转为new ArrayList(map.entrySet())再操作 - 若只需读取、不修改,也可考虑先用
Collections.reverse(list),再用普通 Iterator 正向遍历——但该方法会改变原列表顺序 - 数组或非 List 集合,建议改用传统 for 循环(
for (int i = list.size() - 1; i >= 0; i--))更直接
简单代码示例
(以 ArrayList
List<integer> list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
ListIterator<integer> it = list.listIterator(list.size());
while (it.hasPrevious()) {
Integer val = it.previous();
System.out.println(val); // 输出:5 4 3 2 1
}</integer></integer>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










