Java Iterator vs. Listiterator vs. Spliterator

10 Sept 2024 | 4 分钟阅读

Java 中的 Iterator

它允许我们以顺序的方式逐个遍历集合的元素。它是 Java 集合框架的关键组成部分,可与列表、集合、队列和映射等集合类型配合使用。由于迭代器是单向的,因此它只能向一个方向移动。

Iterator 的特性

  • 方向:单向(仅向前)。
  • 方法:它提供了 delete() 等函数来删除最近检索到的元素(可选操作),next() 来检索下一个元素,以及 hasNext() 来确定是否还有更多元素。
  • 支持 Iterable 集合,如 Collection、List、Set、Queue 和 Map(通过 entrySet())。
  • 迭代器轻量级、易于使用,主要用于只读任务。

IteratorExample.java

输出

Ram
Ravi
Raghu

解释

Iterator 示例中的名称列表由 List<String> 表示。我们使用列表的 iterator() 方法来生成一个 Iterator。Iterator 提供了一种简单的方法来迭代遍历列表的元素。只要还有更多元素(iterator.hasNext()),while 循环就会一直运行。我们在循环中使用 iterator.next() 来获取并输出每个元素。此示例演示了如何使用迭代器按顺序获取集合中的元素。

Java 中的 ListIterator

在 Java 中,ListIterator 是 Iterator 的一个子接口,专门为列表设计。通过提供双向遍历和在迭代时修改列表的能力,它扩展了 Iterator 的可能性。

ListIterator 的特性

  • 双向:既可以向前移动,也可以向后移动。
  • 方法:ListIterator 包含 hasPrevious() 来查看是否有前一个条目,previous() 来向后移动,以及 add()、remove() 和 set() 等用于列表操作的方法,此外还提供了 Iterator 的方法。
  • 支持的集合:主要与 List 实现(如 LinkedList 和 ArrayList)一起使用。
  • 特性:ListIterator 适用于需要在迭代期间修改列表的情况,因为它们同时处理读写操作。

ListIteratorExample.java

输出

Red
Green
Blue
Blue
Green
Red

解释

ListIterator 示例侧重于双向遍历和修改列表。我们使用 List<String> 来表示颜色列表。通过列表的 listIterator() 函数,我们可以获得一个 ListIterator。代码的第一部分使用 listIterator.hasNext() 和 listIterator.next() 来演示向前遍历。在第二部分中,使用 listIterator.hasPrevious() 和 listIterator.previous() 演示了向后遍历。ListIterator 比基本 Iterator 更灵活,因为它具有额外的(add()、remove() 和 set())方法,用于在遍历列表时进行修改。

Java 中的 Spliterator

作为 Stream API 的一部分,Java 8 引入了 Spliterator 接口。通过其并行遍历和元素拆分功能,可以更有效地并行处理大型数据集。

Spliterator 的特性

  • 支持同时进行多项处理。
  • 方法:Spliterator 提供了多种函数,包括 tryAdvance() 用于迭代遍历元素,forEachRemaining() 用于批量处理,trySplit() 用于将元素拆分成两半以并行处理,以及 characteristics() 用于描述其属性。
  • 支持的集合:使用 keySet() 和 values() 来处理 Collection、List、Set 和 Map 集合类型。
  • Splitterators 可与并行流一起使用以提高性能,因为它们是为并行拆分和迭代而设计的。

SpliteratorExample.java

输出

1
2
3
4
5

解释

在 Spliterator 示例中,我们处理的是由 List<Integer> 表示的整数列表。要获取 Spliterator,请使用 spliterator() 函数。Spliterator 旨在并行处理;代码中演示了顺序和并行遍历。对于顺序遍历,使用 forEachRemaining() 方法;对于并行处理,使用 trySplit() 将 Spliterator 拆分成两部分。此示例以基本方式演示了如何在列表上下文中使用 Spliterator。Spliterator 在处理大型数据集和并发流时非常有用。

Iterator、ListIterator 和 Spliterator 之间的区别

特性IteratorListIteratorSpliterator
方向s双向支持并行处理
方法hasNext()、next()、remove()hasNext()、next()、hasPrevious()、previous()、add()、remove()、set()tryAdvance()、forEachRemaining()、trySplit()、characteristics()
支持的集合Collection、List、Set、Queue、Map(通过 entrySet())List(ArrayList、LinkedList)Collection、List、Set、Map(通过 keySet()、values())
特性简单、轻量、只读支持读写操作支持并行迭代和拆分