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 方法

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 cursor types

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();
List Iterator in Java

namesIterator.hasNext();
namesIterator.next();
ListIterator backward traversing

namesIterator.hasPrevious();
namesIterator.previous();
ListIterator cursor diagram

namesIterator.hasPrevious();
ListIterator traversing

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文档。

bannerAds