Java ListIterator – Java 中的 ListIterator

正如我們所知,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 在兩個方向上工作,這意味著它既可以向前工作,也可以向後工作。它是一個雙向迭代器。為了支持這種功能,它有兩組方法。

  • 正向迭代方法
    我们需要使用以下方法来支持正向迭代:
  1. hasNext())
  2. next()
  3. nextIndex()
  • 反向迭代方法
    我们需要使用以下方法来支持反向迭代:
  1. hasPrevious()
  2. previous()
  3. 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