正如我們所知,Java有四種游標:Enumeration、Iterator、ListIterator和Spliterator。我們已經在我之前的帖子中討論了Enumeration和Iterator游標。在閱讀本帖子之前,請參閱我之前的帖子:Java 迭代器。在這篇文章中,我們將討論第三個Java游標:ListIterator。
Java ListIterator
與Iterator類似,ListIterator是一個Java迭代器,用於從List實現的對象中逐個迭代元素。
- 它自Java 1.2開始提供。
- 它擴展了Iterator接口。
- 它僅對於List實現的類有用。
- 與Iterator不同,它支持所有四種操作:CRUD(CREATE、READ、UPDATE和DELETE)。
- 與Iterator不同,它支持向前和向後兩個方向的迭代。
- 它是一個雙向迭代器。
- 它沒有當前元素;它的游標位置始終位於調用previous()返回的元素和調用next()返回的元素之間。
注意:-在Collection API中,CRUD操作是什麼意思?
- CREATE:向Collection對象中添加新元素。
- READ:從Collection對象中檢索元素。
- 更新:更新或设置Collection对象中的现有元素。
- 删除:从Collection对象中删除元素。
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操作:CREATE(創建)、READ(讀取)、UPDATE(更新)和DELETE(刪除)操作。
- 它支援向前和向後迭代。這意味著它是一個雙向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中列表迭代器的全部。我希望這些Java列表迭代器的理論和示例能幫助您開始進行列表迭代器編程。參考:列表迭代器 API 文檔
Source:
https://www.digitalocean.com/community/tutorials/java-listiterator