Java ListIterator – Java中的ListIterator

正如我们所知,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可以在两个方向上工作,即它可以在向前方向和向后方向工作。它是一个双向迭代器。为了支持这种功能,它有两套方法。

  • 正向迭代方法
    我们需要使用以下方法来支持正向迭代:
  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操作:创建、读取、更新和删除操作。
  • 它支持正向和反向迭代。这意味着它是一个双向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