Java ListIterator使用指南:列表迭代器的方法与应用实例
我们知道Java有四个游标:Enumeration,Iterator,ListIterator和Spliterator。我们已经在之前的帖子中讨论了Enumeration和Iterator游标。在阅读本帖子之前,请先阅读我的上一篇帖子:Java Iterator。在本文中,我们将讨论第三个Java游标:ListIterator。
Java的ListIterator
和Iterator一样,ListIterator是Java中的一个迭代器,用于逐个访问实现了List接口的对象中的元素。
- 自Java 1.2版本起可用。
- 它扩展了Iterator接口。
- 它仅对实现了List的类有用。
- 与Iterator不同,它支持所有四种操作:CRUD(创建、读取、更新和删除)。
- 与Iterator不同,它支持正向和反向迭代。
- 它是一个双向迭代器。
- 它没有当前元素;它的光标位置始终位于通过调用previous()将返回的元素和通过调用next()将返回的元素之间。
请解释集合API中的CRUD操作是什么?
- CREATE:向集合对象添加新元素。
- READ:从集合对象中检索元素。
- UPDATE:更新或设置集合对象中的现有元素。
- DELETE:从集合对象中移除元素。
Java ListIterator 类的类图

Java ListIterator 方法
Java ListIterator 接口具有以下方法。
- void add(E e):将指定元素插入列表。
- boolean hasNext():如果此列表迭代器在正向遍历列表时有更多元素,则返回true。
- boolean hasPrevious():如果此列表迭代器在反向遍历列表时有更多元素,则返回true。
- E next():返回列表中的下一个元素,并将光标位置前移。
- int nextIndex():返回后续调用next()将返回的元素的索引。
- E previous():返回列表中的前一个元素,并将光标位置后移。
- int previousIndex():返回后续调用previous()将返回的元素的索引。
- void remove():从列表中移除next()或previous()返回的最后一个元素。
- void set(E e):用指定元素替换next()或previous()返回的最后一个元素。
在接下来的部分中,我们将一一探讨这些方法,并举出有用的例子。
Java ListIterator 基本示例
在本节中,我们将讨论一些带有示例的ListIterator方法。首先,我们需要了解如何获取此迭代器对象。怎么获取ListIterator呢?
ListIterator<E> listIterator()
这将返回一个列表迭代器,用于遍历此列表中的各个元素。例如:
import java.util.*;
public class ListIteratorDemo
{
public static void main(String[] args)
{
List<String> names = new LinkedList<>();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// 获取ListIterator
ListIterator<String> namesIterator = names.listIterator();
// 遍历元素
while(namesIterator.hasNext()){
System.out.println(namesIterator.next());
}
// 增强for循环在此处创建内部迭代器
for(String name: names){
System.out.println(name);
}
}
}
输出:
Rams
Posa
Chinni
双向迭代示例:ListIterator
在本节中,我们将探索ListIterator的方法如何用于执行正向迭代和反向迭代。
import java.util.*;
public class BiDirectinalListIteratorDemo
{
public static void main(String[] args)
{
List<String> names = new LinkedList<>();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// 获取ListIterator
ListIterator<String> listIterator = names.listIterator();
// 遍历元素
System.out.println("正向迭代:");
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
// 遍历元素,此时迭代器位于末尾
System.out.println("反向迭代:");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
输出:
正向迭代:
Rams
Posa
Chinni
反向迭代:
Chinni
Posa
Rams
Java 迭代器的类型
正如我们所知,Java有四个游标:Enumeration、Iterator、ListIterator和Spliterator。我们可以将它们分为两种主要类型,如下所示:
- 单向迭代器
它们是只支持正向迭代的游标。例如,Enumeration、Iterator等是单向迭代器。 - 双向迭代器
它们是支持正向和反向迭代的游标。例如,ListIterator是双向迭代器。

Java ListIterator的内部工作原理是什么?
正如我们所知,Java的ListIterator既可以在正向方向上工作,也可以在反向方向上工作。它是一个双向迭代器。为了支持这个功能,它有两组方法。
- Forward Direction Iteration methods
We need to use the following methods to support Forward Direction Iteration:
- hasNext() – 是否有下一个元素
next() – 返回下一个元素
nextIndex() – 返回下一个元素的索引
- Backward Direction Iteration methods
We need to use the following methods to support Backward Direction Iteration:
- 有前一个吗?(hasPrevious())
前一个 (previous())
前一个索引 (previousIndex())
在我之前的帖子中,我们已经讨论过如何在向前的方向上内部运作的迭代器,即“Java迭代器的内部工作原理”部分。即使ListIterator也是以相同的方式工作。如果您想查看我之前的帖子,请点击这里:Java迭代器。在这一部分,我们将讨论ListIterator在向后方向上的工作原理。让我们拿以下的LinkedList对象来理解这个功能。
List<String> names = new LinkedList<>();
names.add("E-1");
names.add("E-2");
names.add("E-3");
.
.
.
names.add("E-n");
现在在LinkedList上创建一个ListIterator对象,如下所示:
ListIterator<String> namesIterator = names.listLterator();

namesIterator.hasNext();
namesIterator.next();

namesIterator.hasPrevious();
namesIterator.previous();

namesIterator.hasPrevious();

ListIterator的优势
与迭代器不同,列表迭代器具有以下优点:
- Like Iterator, it supports READ and DELETE operations.
- It supports CREATE and UPDATE operations too.
- That means, it supports CRUD operations: CREATE, READ, UPDATE and DELETE operations.
- It supports both Forward direction and Backward direction iteration. That means it’s a Bi-Directional Java Cursor.
- Method names are simple and easy to use them.
ListIterator的限制
与迭代器相比,Java的ListIterator具有许多优点。然而,它仍然有以下一些限制。
- It is an Iterator only List implementation classes.
- Unlike Iterator, it is not applicable for whole Collection API.
- It is not a Universal Java Cursor.
- Compare to Spliterator, it does NOT support Parallel iteration of elements.
- Compare to Spliterator, it does NOT support better performance to iterate large volume of data.
迭代器和列表迭代器之间的相似之处
在这一部分中,我们将讨论Java两个游标之间的相似之处:迭代器和列表迭代器。
- Bother are introduced in Java 1.2.
- Both are Iterators used to iterate Collection or List elements.
- Both supports READ and DELETE operations.
- Both supports Forward Direction iteration.
- Both are not Legacy interfaces.
迭代器和列表迭代器之间的区别
在这一部分中,我们将讨论Java两种迭代器:Iterator和ListIterator之间的差异。
Iterator | ListIterator |
---|---|
Introduced in Java 1.2. | Introduced in Java 1.2. |
It is an Iterator for whole Collection API. | It is an Iterator for only List implemented classes. |
It is an Universal Iterator. | It is NOT an Universal Iterator. |
It supports only Forward Direction Iteration. | It supports both Forward and Backward Direction iterations. |
It’s a Uni-Directional Iterator. | It’s a Bi-Directional Iterator. |
It supports only READ and DELETE operations. | It supports all CRUD operations. |
We can get Iterator by using iterator() method. | We can ListIterator object using listIterator() method. |
这就是关于Java中ListIterator的全部内容。希望这些Java ListIterator的理论和例子能帮助你开始ListIterator编程。参考文献:ListIterator API文档。