descendingiterator()返回受限的listiterator,仅支持hasprevious()/previous()逆序遍历,起点为last节点,fail-fast且禁止结构性修改;适用于日志倒查、回滚栈等右结合场景。

LinkedList 的 descendingIterator() 是专为高效逆序遍历设计的工具,它不复制数据、不重建结构,而是直接从链表尾部出发,利用双向链表的 prev 指针逐个回溯。用对了很轻量,用错了会抛异常或行为异常。
它返回的是 ListIterator,但只能反向操作
虽然方法签名返回 Iterator<e></e>,实际返回的是 ListIterator<e></e> 实例,只是功能被严格限制:
-
hasNext()永远返回 false,不能用于正向判断 -
next()调用时直接抛UnsupportedOperationException - 只应使用
hasPrevious()和previous()—— 它们才是真实生效的操作 - 内部起点是
last节点,第一次previous()返回的就是末尾元素
遍历时修改链表要格外小心
这个迭代器是 fail-fast 的,任何非迭代器自身的结构性修改都会立即触发异常:
- 在遍历中调用
list.add()、list.remove()或list.clear()→ 抛ConcurrentModificationException - 唯一安全的修改方式是迭代器自己的
remove()方法(需先调用previous()) - 不要同时用正向迭代器和 descendingIterator 修改同一个链表,modCount 检查极易失败
适合“后进先出”语义的典型场景
不必强行套用,真正发挥优势的场景有明确特征:
- 日志倒查:按时间倒序读取最近几条记录,只需调
previous()3–5 次,无需遍历全部 - 回滚栈操作:把操作步骤存入 LinkedList,用
descendingIterator依次撤销 - 右结合表达式求值(如幂运算 a^b^c),需从右往左处理操作数
- 替代手动循环索引:比
for (int i = list.size()-1; i >= 0; i--)更语义清晰,且避免get(i)的 O(n) 开销
一个简洁可靠的使用范式
推荐始终用 hasPrevious() + previous() 组合,避免误用 next():
List<string> list = new LinkedList(Arrays.asList("a", "b", "c", "d"));
ListIterator<string> di = list.descendingIterator();
while (di.hasPrevious()) {
System.out.println(di.previous()); // 输出: d, c, b, a
}</string></string>
这样写逻辑清晰、类型安全、不易出错。不需要 try-catch 包裹,也不依赖元素数量预判。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











