Java ListIterator – Java中的ListIterator

时间:2020-02-23 14:36:32  来源:igfitidea点击:

众所周知,Java有四个游标:Enumeration,Iterator,ListIterator和Spliterator。
在上一篇文章中,我们已经讨论了Enumeration和Iterator游标。
在阅读本文之前,请阅读我以前的文章:Java Iterator。

在本文中,我们将讨论第三个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操作是什么?

  • 创建:向Collection对象添加新元素。

  • 阅读:从Collection对象中检索元素。

  • 更新:更新或者设置Collection对象中的现有元素。

  • 删除:从集合对象中删除元素。

Java ListIterator类图

在Java中,ListIterator是Collection API中的接口。
它扩展了Iterator接口。
为了支持前进和后退方向迭代以及CRUD操作,它具有以下方法。
我们可以将此Iterator用于所有List实现的类,例如ArrayList,CopyOnWriteArrayList,LinkedList,Stack,Vector等。

在接下来的部分中,我们将使用一些有用的方法来深入探讨这些方法。

Java ListIterator方法

Java ListIterator接口具有以下方法。

  • void add(E e):将指定的元素插入列表。

  • boolean hasNext():如果在向前遍历列表时此列表迭代器包含更多元素,则返回true。

  • boolean hasPrevious():如果在反向遍历列表时此列表迭代器包含更多元素,则返回true。

  • E next():返回列表中的下一个元素并前进光标位置。

  • int nextIndex():返回元素的索引,该元素的索引将由对next()的后续调用返回。

  • E previous():返回列表中的上一个元素,并将光标位置向后移动。

  • int previousIndex():返回元素的索引,该元素的索引将由对next()的后续调用返回。

  • 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&gt names = new LinkedList<>();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
		
	//Getting ListIterator
	ListIterator<String&gt namesIterator = names.listIterator();
	
	//Traversing elements
	while(namesIterator.hasNext()){
	   System.out.println(namesIterator.next());			
	}	

	//Enhanced for loop creates Internal Iterator here.
	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&gt names = new LinkedListt<>();
		names.add("Rams");
		names.add("Posa");
		names.add("Chinni");
		
		//Getting ListIterator
		ListIterator<String&gt listIterator = names.listIterator();
		
		//Traversing elements
		System.out.println("Forward Direction Iteration:");
		while(listIterator.hasNext()){
			System.out.println(listIterator.next());			
		}	
		
		//Traversing elements, 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。
我们可以将它们分为两种主要类型,如下所示:

  • 单向迭代器

它们是仅支持正向迭代的游标。
例如,枚举,迭代器等是单向迭代器。

  • 双向迭代器
    They are Cursors which supports Both Forward Direction and Backward Direction iterations. For instance, ListIterator is Bi-Directional Iterator.

Java ListIterator在内部如何工作?

众所周知,Java ListIterator可以在两个方向上工作,这意味着它既可以在正向也可以在反向进行。
它是一个双向迭代器。
为了支持此功能,它具有两组方法。

  • 正向迭代方法

我们需要使用以下方法来支持正向迭代:

  • hasNext())
  • 下一个()
  • nextIndex()
  • 向后方向迭代方法

我们需要使用以下方法来支持向后方向迭代:

  • hasPrevious()
  • 以前()
  • previousIndex()

在我以前的文章中,我们已经在" Java迭代器的内部工作方式"中讨论了转发方向上迭代器的内部工作方式。
部分。
甚至ListIterator也以相同的方式工作。
如果您想浏览我以前的文章,请单击此处:Java Iterator。

在本节中,我们将讨论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的Cursor指向List的第一个元素之前的。
现在,我们在while循环中运行以下代码段。

namesIterator.hasNext();
namesIterator.next();

当我们在while循环中运行上述代码段时,ListIterator的Cursor指向LinkedList中的最后一个元素。

然后,我们可以运行以下代码段以从头开始遍历。

namesIterator.hasPrevious();
namesIterator.previous();

当我们运行上述代码片段时,ListIterator的Cursor指向List中的" Last but one"元素,如上图所示。
执行此过程,将ListIterator的Cursor移到LinkedList的第一个元素。

读取第一个元素后,如果我们运行下面的代码片段,它将返回" false"值。

namesIterator.hasPrevious();

当ListIterator的Cursor指向LinkedList的第一个元素之前的位置时,hasPrevious()方法将返回一个假值。

观察完所有这些图之后,我们可以说Java ListIterator支持正向和反向迭代,如下图所示。
因此,它也被称为双向光标。

前向ListIterator

向后方向ListIterator

ListIterator的优点

与Iterator不同,ListIterator具有以下优点:

  • 与Iterator一样,它支持READ和DELETE操作。

  • 它也支持CREATE和UPDATE操作。

  • 这意味着它支持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元素的迭代器。

  • 两者都支持READ和DELETE操作。

  • 两者都支持正向迭代。

  • 两者都不是旧版接口。

Iterator和ListIterator之间的区别

在本节中,我们将讨论Java两个迭代器之间的区别:迭代器和ListIterator。

IteratorListIterator
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.