Iterator是通用单向遍历器,适用于所有Iterable集合;ListIterator是List专属双向迭代器,支持增删改、反向遍历和索引定位。

Iterator 和 ListIterator 都是 Java 中用于遍历集合的接口,但它们在功能、适用范围和操作能力上有明确分工。简单说:Iterator 是通用型单向遍历工具;ListIterator 是专为 List 设计的增强版双向迭代器,支持修改、定位和反向操作。
适用集合类型不同
Iterator 可用于所有实现了 Iterable 接口的集合,包括 List、Set、Map.keySet()、Map.values() 等。而 ListIterator 只能用于 List 实现类(如 ArrayList、LinkedList、Vector),对 Set 或 Map 直接调用 listIterator() 会编译报错。
遍历方向与起始位置
Iterator 只能从头到尾单向遍历,且只能从集合开头开始。
- 调用
iterator()后,游标位于第一个元素之前 - 每次
next()移动游标并返回后一个元素
ListIterator 支持双向遍历,并允许指定起始索引:
立即学习“Java免费学习笔记(深入)”;
-
listIterator():游标在开头(索引 0 前) -
listIterator(3):游标在索引 3 处(即第 4 个元素之前) - 可用
hasPrevious()/previous()往回走
元素修改能力差异大
Iterator 仅提供 remove() —— 删除上一次 next() 返回的元素,且每调用一次 next() 后最多调用一次 remove(),否则抛异常。
ListIterator 提供完整编辑能力:
-
add(e):在当前游标位置前插入新元素(不影响后续next(),但会改变previous()结果) -
set(e):替换上一次next()或previous()返回的元素 -
remove():行为同 Iterator,但可基于正向或反向遍历触发
额外位置信息支持
ListIterator 能精确反映当前游标在列表中的逻辑位置:
-
nextIndex():返回下一个next()将取到的元素索引(若游标在末尾则返回list.size()) -
previousIndex():返回上一个previous()将取到的元素索引(若游标在开头则返回 -1)
Iterator 没有索引相关方法,无法获知当前位置对应原始集合的下标。
不复杂但容易忽略:选哪个,关键看需求——只读遍历用 Iterator;需要边走边改、来回切换或精确定位时,ListIterator 是唯一选择。


















