正如我们所知,Java有四个游标:Enumeration、Iterator、ListIterator和Spliterator。我们已经在我之前的帖子中讨论了Enumeration和Iterator游标。在阅读本帖子之前,请先阅读我的上一篇帖子:Java 迭代器。在本帖子中,我们将讨论第三个Java游标:ListIterator。
Java ListIterator
像Iterator一样,ListIterator是Java的一个迭代器,用于逐个从列表实现的对象中迭代元素。
- 它从Java 1.2版本开始提供。
- 它扩展了Iterator接口。
- 它仅适用于列表实现的类。
- 与Iterator不同,它支持所有四种操作:CRUD(CREATE、READ、UPDATE和DELETE)。
- 与Iterator不同,它支持前向和后向迭代。
- 它是一个双向迭代器。
- 它没有当前元素;其游标位置始终位于通过调用previous()返回的元素和通过调用next()返回的元素之间。
注意:-Collection API中的CRUD操作是什么?
- CREATE:向集合对象中添加新元素。
- READ:从集合对象中检索元素。
- 更新: 更新或设置集合对象中的现有元素。
- 删除: 从集合对象中删除元素。
Java ListIterator 类图
在Java中,ListIterator是Collection API中的一个接口,它扩展了Iterator接口。为了支持正向和反向迭代以及CRUD操作,它具有以下方法。我们可以在所有实现了List的类(如ArrayList,CopyOnWriteArrayList,LinkedList,Stack,Vector等)中使用此迭代器。 在接下来的部分中,我们将深入探讨这些方法以及一些有用的方法。
Java ListIterator 方法
Java ListIterator 接口有以下方法。
- void add(E e): 将指定的元素插入列表中。
- boolean hasNext(): 如果正向遍历列表时此列表迭代器有更多元素,则返回true。
- boolean hasPrevious(): 如果反向遍历列表时此列表迭代器有更多元素,则返回true。
- E next(): Returns the next element in the list and advances the cursor position.
- int nextIndex(): 返回通过后续调用next()将返回的元素的索引。
- E previous(): Returns the previous element in the list and moves the cursor position backwards.
- 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();
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();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// 获取ListIterator
ListIterator<String> listIterator = names.listIterator();
// 遍历元素
System.out.println("Forward Direction Iteration:");
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
// 遍历元素, the iterator is at the end at this point
System.out.println("Backward Direction Iteration:");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
输出:-
Forward Direction Iteration:
Rams
Posa
Chinni
Backward Direction Iteration:
Chinni
Posa
Rams
Java迭代器的类型
我们知道Java有四种光标:Enumeration,Iterator,ListIterator和Spliterator。我们可以将它们分为两种主要类型,如下所示:
- 单向迭代器
它们是只支持向前迭代的光标。例如,Enumeration,Iterator等都是单向迭代器。- 双向迭代器
它们是支持向前和向后迭代的光标。例如,ListIterator是双向迭代器。
Java ListIterator的内部工作原理?
正如我们所知,Java ListIterator可以在两个方向上工作,即它可以在向前方向和向后方向工作。它是一个双向迭代器。为了支持这种功能,它有两套方法。
- 正向迭代方法
我们需要使用以下方法来支持正向迭代:
- hasNext())
- next()
- nextIndex()
- 反向迭代方法
我们需要使用以下方法来支持反向迭代:
- 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” ListIterator看起来像下面这样: 这里ListIterator的光标指向列表的第一个元素之前。现在我们在while循环中运行以下代码片段。
namesIterator.hasNext();
namesIterator.next();
当我们在while循环中运行上面的代码片段时,ListIterator的光标指向LinkedList中的最后一个元素。 然后我们可以运行以下代码片段来从末尾开始遍历。
namesIterator.hasPrevious();
namesIterator.previous();
当我们运行以上代码片段时,ListIterator的游标指向列表中的“倒数第二”个元素,如上图所示。执行以下过程将ListIterator的游标移到LinkedList的第一个元素。在读取第一个元素后,如果我们运行以下代码片段,则返回“false”值。
namesIterator.hasPrevious();
由于ListIterator的游标指向LinkedList的第一个元素之前,hasPrevious()方法返回false值。观察所有这些图表后,我们可以说Java ListIterator支持正向和反向迭代,如下图所示。因此,它也被称为双向游标。正向 ListIterator
反向 ListIterator
ListIterator 的优势
与 Iterator 不同,ListIterator 具有以下优势:
- 与 Iterator 一样,它支持读取和删除操作。
- 它还支持创建和更新操作。
- 这意味着它支持CRUD操作:创建、读取、更新和删除操作。
- 它支持正向和反向迭代。这意味着它是一个双向Java游标。
- 方法名称简单易用。
ListIterator的限制
与Iterator相比,Java ListIterator有许多优点。但是,它仍然具有以下一些限制。
- 它只是Iterator的List实现类。
- 与Iterator不同,它不适用于整个Collection API。
- 它不是通用的Java游标。
- 与Spliterator相比,它不支持元素的并行迭代。
- 与Spliterator相比,它不支持迭代大量数据的更好性能。
Iterator和ListIterator之间的相似之处
在这一部分,我们将讨论Java两个游标Iterator和ListIterator之间的相似之处。
- 它们都是在Java 1.2中引入的。
- 它们都是用于迭代Collection或List元素的迭代器。
- 支持读取和删除操作。
- 两者都支持正向迭代。
- 两者都不是传统接口。
迭代器和列表迭代器之间的区别
在本节中,我们将讨论Java中两种迭代器之间的区别:迭代器和列表迭代器。
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文档
Source:
https://www.digitalocean.com/community/tutorials/java-listiterator