Java 中 Iterator 和 ListIterator 的区别及示例

2025 年 6 月 4 日 | 阅读 4 分钟

在 Java 中,Iterator 和 ListIterator 都用于遍历集合。Iterator 允许仅向前遍历,并提供 next() 和 remove() 等基本操作。相比之下,ListIterator 支持双向遍历,并提供了 add()、set() 和 previous() 等附加操作,使其更加通用。

Iterator

Iterator 接口是 Java Collections Framework 的一部分,它提供了一种通用的方式来遍历列表、集和队列等集合。以下是 Iterator 的主要特点:

  • 仅向前遍历: Iterator 允许按顺序向前遍历集合中的元素。
  • 读取和移除操作: 它提供了 next() 方法来获取下一个元素,以及 remove() 方法来移除由 next() 方法返回的最后一个元素。
  • 功能有限: 与 ListIterator 不同,Iterator 接口不支持双向遍历或在迭代期间修改元素。

阅读更多 Java Iterator

Iterator 示例

示例

编译并运行

输出

Using Iterator:
Apple
Banana
Orange

ListIterator

ListIterator 接口扩展了 Iterator 接口,并提供了专门为列表设计的附加功能。以下是 ListIterator 的主要特点:

双向遍历: 与 Iterator 和 ListIterator 一样,它允许在向前和向后两个方向遍历列表。

读取、移除、替换和添加操作: ListIterator 支持 Iterator 的所有操作,以及 hasPrevious()、previous()、set() 和 add() 等方法。这些方法可以在迭代期间修改列表。

阅读更多 Java ListIterator

ListIterator 示例

示例

编译并运行

输出

Using ListIterator:
Apple
Banana
Orange

Orange
Banana
Apple

Iterator 与 ListIterator 对比

特性IteratorListIterator
InterfaceIterator 是一个更通用的接口。ListIterator 是 Iterator 的子接口,并在其基础上扩展,提供了特定于列表的附加方法。
遍历方向支持仅向前遍历。支持向前和向后遍历。
访问元素只读访问元素。读写访问元素。
方法
  • boolean hasNext()
  • E next()
  • void remove() (移除 next() 返回的最后一个元素)
  • 不适用
  • boolean hasNext()
  • E next()
  • boolean hasPrevious()
  • previous()
  • int nextIndex()
  • int previousIndex()
  • void set(E e) (替换 next() 或 previous() 返回的最后一个元素)
  • void add(E e) (将 e 插入到列表中)
适用性适用于遍历任何集合。专门为列表设计(例如,ArrayList、LinkedList)。
用例仅需要向前遍历时。需要向前和向后遍历,以及修改元素时。
支持的集合可与实现 Iterable 接口的任何集合一起使用。可与实现 List 接口的集合一起使用。
修改可以移除元素。可以移除、添加和修改元素。
索引访问不允许索引访问。可以检索上一个和下一个元素的索引。

结论

Iterator 和 ListIterator 有助于导航 Java 集合。Iterator 适用于简单的、仅向前的遍历,而 ListIterator 支持双向遍历并允许元素更新。选择哪一个取决于我们的任务。了解它们的特性有助于编写更清晰、更高效的 Java 代码,以适应程序的需要。

Iterator 和 ListIterator 选择题

1. 以下哪个方法在 Iterator 接口中不可用?

  1. next()
  2. remove()
  3. hasPrevious()
  4. hasNext()
 

答案:C

解释: Iterator 接口仅支持向前遍历,因此它不提供 hasPrevious() 方法。该方法是 ListIterator 所特有的,它允许向前和向后遍历。


2. 什么使得 ListIterator 比 Iterator 更强大?

  1. 它可以处理所有类型的集合
  2. 它可以双向遍历并修改元素
  3. 它在迭代时会自动对元素进行排序
  4. 它默认比 Iterator 更快
 

答案: B

解释: ListIterator 专门为列表设计,提供了更大的灵活性。它允许我们向前和向后移动,在迭代期间添加或修改元素,以及移除它们。


3. 哪些集合可以使用 ListIterator?

  1. 仅 Set
  2. 实现 Iterable 接口的任何类
  3. 仅 List 实现,如 ArrayList 或 LinkedList
  4. 仅 Queue 和 Stack
 

答案:C

解释: ListIterator 是为实现 List 接口的集合而设计的。它不能用于 Set 或 Queue,因为它们没有索引元素。


4. 如果在 Iterator 中调用 remove() 而没有先调用 next(),会发生什么?

  1. 第一个元素将被移除
  2. 将抛出异常
  3. 什么也不做
  4. 它会移除列表中的最后一个元素
 

答案: B

解释: 在调用 next() 之前调用 remove() 会导致 IllegalStateException,因为 remove() 仅在 next() 返回一个元素后才有效。


5. 在下面的代码片段中,第二个 while 循环的输出是什么?

  1. Apple Banana Orange
  2. Orange Banana Apple
  3. 无输出
  4. 编译错误
 

答案: B

解释: 第一个循环将光标移动到列表的末尾。然后第二个循环使用 previous() 向后遍历并以相反的顺序打印元素。