与迭代器(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<E> listIterator()
它返回此列表中元素的列表迭代器。
示例:
import java.util.*;
public class ListIteratorDemo
{
public static void main(String[] args)
{
List<String> names = new LinkedList<>();
names.add("Java");
names.add("Python");
names.add("Ruby");
// Getting ListIterator
ListIterator<String> 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<String> names = new LinkedListt<>();
names.add("Java");
names.add("Python");
names.add("Ruby");
// Getting ListIterator
ListIterator<String> 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<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();
假设 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
相比,它不支持更好的性能来迭代大量数据。