java iterator 本身不支持倒序遍历,需借助 listiterator、反向索引、反转集合或 stream api 等方式实现;其中反向 for 循环最通用高效,listiterator 适用于 list 且支持双向,反转集合会修改原结构,stream 方式适合函数式编程场景。

Java 中的 Iterator 本身不支持倒序遍历,它只提供 hasNext() 和 next() 方法,单向向前。要实现倒序遍历,需借助其他机制,而非直接用原生 Iterator。
使用 ListIterator(仅适用于 List)
ListIterator 是 Iterator 的子接口,支持双向遍历,可用于 ArrayList、LinkedList 等 List 实现类。
- 调用
list.listIterator(list.size())获取指向末尾的迭代器 - 用
hasPrevious()判断是否还有前一个元素 - 用
previous()获取前一个元素(即从后往前取)
示例:
List<string> list = Arrays.asList("a", "b", "c");
ListIterator<string> lit = list.listIterator(list.size());
while (lit.hasPrevious()) {
System.out.println(lit.previous()); // 输出 c, b, a
}
</string></string>反转集合后再用普通 Iterator
对支持修改的集合(如 ArrayList),可先反转再遍历;注意这会改变原集合顺序,若需保持原样,应操作副本。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用
Collections.reverse(list)反转原列表(会修改原集合) - 或创建新列表:
new ArrayList(originalList).reversed()(Java 21+) - 再用
iterator()正常遍历,效果即为倒序
使用 for 循环反向索引(最通用、推荐)
不依赖迭代器,直接通过下标从后往前访问,适用于所有 RandomAccess 集合(如 ArrayList),简洁高效。
- 从
list.size() - 1开始,递减到0 - 避免
ConcurrentModificationException,也不修改原集合 - 对数组、
ArrayList等性能最优
示例:
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}
Stream API 倒序(Java 8+,函数式风格)
对不可变或需链式处理的场景,可用 Stream + Collectors.collectingAndThen 或先转数组再反向流。
- 简单方式:转成数组后用
IntStream.range(0, arr.length).mapToObj(i -> arr[arr.length - 1 - i]) - 更实用的是结合
Lists.reverse()(Guava)或自定义工具方法 - 注意:
Stream.iterate或Stream.of本身不提供内置倒序,需手动控制顺序
不复杂但容易忽略:标准 Iterator 设计就是单向的,倒序本质是换一种访问逻辑,选哪种方式取决于集合类型、是否允许修改、以及代码可读性要求。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










