与迭代器(Iterator)一样,ListIterator是一个Java迭代器(Iterator),用于从List实现的对象中逐个迭代元素。
它从Java 1.2开始提供。
它扩展了Iterator接口。
它仅对List实现的类有用。
与Iterator不同,它支持所有四种操作:CRUD(CREATE,READ,UPDATE和DELETE)。
与Iterator不同,它支持正向和反向迭代。
它是一个双向迭代器。
它没有当前元素; 它的光标位置总是位于调用previous()返回的元素和调用next()返回的元素之间。
注意: - Collection API中的CRUD操作是什么?
CREATE:向Collection对象添加新元素。
READ:从Collection对象中检索元素。
UPDATE:更新或设置Collection对象中的现有元素。
DELETE:从Collection对象中删除元素。
1. Java ListIterator类图
在Java中,ListIterator是Collection API中的一个接口。它扩展了Iterator接口。为了支持前向和后向迭代和CRUD操作,它具有以下方法。可以将这个Iterator用于所有List实现的类,如:ArrayList,CopyOnWriteArrayList,LinkedList,Stack,Vector等。
在接下来的部分中使用一些有用的方法,并深入学习如何使用这些方法。
2. Java ListIterator方法
Java ListIterator接口具有以下方法。
编号
方法
描述
1
void add(E e)
将指定的元素插入列表中。
2
boolean hasNext()
如果此列表迭代器在向前遍历列表时具有元素,则返回true。
3
boolean hasPrevious()
如果此列表迭代器在反向遍历列表时具有元素,则返回true。
4
E next()
返回列表中的下一个元素。
5
int nextIndex()
返回元素的索引。
6
E previous()
返回列表中的上一个元素并向后移动光标位置。
7
int previousIndex()
返回元素的索引。
8
void remove()
从列表中删除由next()或previous()返回的最后一个元素。
9
void set(E e)
用指定的元素替换由next()或previous()返回的最后一个元素。
3. Java ListIterator基本示例
在本节中,将通过一些示例学习一些ListIterator方法。首先,需要了解如何获取此迭代器对象。
如何获得ListIterator?
ListIterator listIterator()
它返回此列表中元素的列表迭代器。
示例:
import java.util.*;
public class ListIteratorDemo
{
public static void main(String[] args)
{
List names = new LinkedList<>();
names.add("Java");
names.add("Python");
names.add("Ruby");
// Getting ListIterator
ListIterator namesIterator = names.listIterator();
// 遍历元素
while(namesIterator.hasNext()){
System.out.println(namesIterator.next());
}
// 增强的for循环在此创建内部迭代器。
for(String name: names){
System.out.println(name);
}
}
}
ListIterator双向迭代示例
在本节中,将学习ListIterator如何执行正向和反向迭代。
import java.util.*;
public class BiDirectinalListIteratorDemo
{
public static void main(String[] args)
{
List names = new LinkedListt<>();
names.add("Java");
names.add("Python");
names.add("Ruby");
// Getting ListIterator
ListIterator listIterator = names.listIterator();
// 遍历元素
System.out.println("Forward Direction Iteration:");
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
// 遍历元素
System.out.println("Backward Direction Iteration:");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
执行上面示例代码,得到以下结果 -
Forward Direction Iteration:
Java
Python
Ruby
Backward Direction Iteration:
Ruby
Python
Java
4. Java迭代器的类型
Java有四个游标:Enumeration,Iterator,ListIterator和Spliterator。可以将它们分为两种主要类型,如下所示:
单向迭代器
它们仅支持向前迭代。例如,Enumeration,Iterator等是单向迭代器。
双向迭代器
它们是支持前向和后向迭代的游标。例如,ListIterator是双向迭代器。
5. Java ListIterator如何在内部工作?
众所周知,Java ListIterator可以在两个方向上工作,它可以在向前方向和向后方向上工作。它是一个双向迭代器。为了支持此功能,它有两组方法 -
正向迭代方法
需要使用以下方法来支持正向迭代:hasNext(),next(),nextIndex()
向后方向迭代方法
需要使用以下方法来支持向后方向迭代:hasPrevious(),previous(),previousIndex()
在本节中,我们将讨论ListIterator如何在向后方向中工作。使用以下LinkedList对象来理解此功能。
List names = new LinkedList<>();
names.add("E-1");
names.add("E-2");
names.add("E-3");
.
.
.
names.add("E-n");
现在在LinkedList上创建一个ListIterator对象,如下所示:
ListIterator namesIterator = names.listLterator();
假设 ListIterator namesIterator在开始时,如下所示:
这里ListIterator的游标指向List的前一个元素。运行以下代码片段。
namesIterator.hasPrevious();
namesIterator.previous();
当运行上面的代码片段时,ListIterator的游标指向LinkedList中的最后一个元素,如上图所示。
然后运行以下代码段 -
namesIterator.hasPrevious();
namesIterator.previous();
当运行上面的代码片段时,ListIterator的游标指向List中的倒数第二个元素,如下图所示。
执行此过程将一直将ListIterator的游标传递到LinkedList的第一个元素。
在读取第一个元素后,如果运行下面的代码片段,它将返回false值。
namesIterator.hasPrevious();
当ListIterator的游标指向LinkedList的第一个元素之前,hasPrevious()方法返回false值。
在观察了所有这些图之后,可以说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相比,它不支持更好的性能来迭代大量数据。
¥ 我要打赏
纠错/补充
收藏
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。