ListIterator是List专属双向迭代器,支持next()/previous()、add()/set()/remove();普通Iterator仅单向next()且不支持add()。

什么是 ListIterator,和普通 Iterator 有什么区别
ListIterator 是 List 专属的迭代器,支持双向移动(next() 和 previous()),还能在遍历中修改元素(set())、插入新元素(add())。普通 Iterator 只能单向 next(),且不支持添加操作,调用 remove() 后再调用 next() 或 previous() 还容易抛 IllegalStateException。
关键限制:只有 ArrayList、LinkedList 等实现了 List 接口的集合才支持 ListIterator;HashSet 或 TreeSet 不行。
如何正确初始化并正向遍历
必须通过 list.listIterator() 获取,不能直接 new。初始位置在索引 0 之前(即“头哨兵”位置),第一次调用 next() 才拿到第 0 个元素。
-
hasNext()判断是否还有下一个元素(从当前位置往后) -
next()返回当前元素并把游标前移一位 -
nextIndex()返回下一次next()将取到的索引(不是当前元素索引)
Listlist = Arrays.asList("a", "b", "c"); ListIterator it = list.listIterator(); while (it.hasNext()) { System.out.println(it.next()); // 输出 a, b, c }
反向遍历必须先走到末尾再调用 previous()
刚创建的 ListIterator 无法直接 previous()——会抛 NoSuchElementException,因为游标不在任何元素“之后”。必须先用 next() 走到末尾,或用带参构造 list.listIterator(list.size()) 把游标初始化到末尾位置。
立即学习“Java免费学习笔记(深入)”;
-
hasPrevious()判断是否还有前一个元素(从当前位置往前) -
previous()返回前一个元素并把游标后退一位 -
previousIndex()返回下一次previous()将取到的索引
ListIteratorit = list.listIterator(list.size()); while (it.hasPrevious()) { System.out.println(it.previous()); // 输出 c, b, a }
add()、set()、remove() 的调用时机很关键
add() 总是插入到游标当前位置(即 next() 将取的位置),不影响已遍历过的元素;set() 只能修改上一次 next() 或 previous() 返回的元素;remove() 只能删除上一次 next() 或 previous() 返回的元素,且每调用一次只能删一个,重复调用会抛异常。
- 调用
add()后,nextIndex()和previousIndex()都会更新 -
set()前必须至少调用过一次next()或previous(),否则抛IllegalStateException - 在
next()和previous()之间频繁切换时,set()的行为容易混淆——它始终作用于最近一次取值的那个元素
双向遍历本身不难,但混合增删改时,游标位置、索引偏移、并发修改检查(ConcurrentModificationException)三者叠加,稍不注意就会逻辑错位或崩溃。










