Java ListIterator – 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(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> names = new LinkedList<>(); names.add("Rams"); names.add("Posa"); names.add("Chinni"); //Getting ListIterator ListIterator<String> 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> names = new LinkedListt<>(); names.add("Rams"); names.add("Posa"); names.add("Chinni"); //Getting ListIterator ListIterator<String> 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。
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. |