在 Java 里,ListIterator 和 Iterator 均为用于遍历集合元素的迭代器接口,不过二者存在一些差异,并且 ListIterator 具备额外的功能。下面将详细阐述:
1. Iterator 接口
Iterator 是 Java 集合框架中最基础的迭代器接口,其作用是遍历集合中的元素。它定义了以下关键方法:
hasNext():用于判断集合中是否还有下一个元素。next():返回集合中的下一个元素。remove():移除next()方法返回的最后一个元素。
以下是一个使用 Iterator 遍历 List 的示例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
2. ListIterator 接口
ListIterator 是 Iterator 的子接口,它专门用于遍历 List 集合。ListIterator 提供了比 Iterator 更多的功能,具体如下:
- 双向遍历:不仅能向前遍历,还能向后遍历。
- 元素操作:可在遍历过程中添加、修改元素。
- 获取索引:能够获取当前元素的索引。
ListIterator 定义了以下额外方法:
hasPrevious():判断集合中是否还有前一个元素。previous():返回集合中的前一个元素。nextIndex():返回下一个元素的索引。previousIndex():返回前一个元素的索引。add(E e):在当前位置添加一个元素。set(E e):用指定元素替换next()或previous()返回的最后一个元素。
以下是一个使用 ListIterator 双向遍历 List 的示例:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
ListIterator<String> listIterator = list.listIterator();
// 向前遍历
System.out.println("Forward traversal:");
while (listIterator.hasNext()) {
String element = listIterator.next();
System.out.println(element);
}
// 向后遍历
System.out.println("Backward traversal:");
while (listIterator.hasPrevious()) {
String element = listIterator.previous();
System.out.println(element);
}
}
}
3. 二者的区别及额外功能总结
- 遍历方向:
Iterator仅支持向前遍历,而ListIterator支持向前和向后双向遍历。 - 元素操作:
Iterator只能在遍历过程中移除元素,ListIterator除了移除元素外,还能添加和修改元素。 - 索引获取:
ListIterator可以获取当前元素的索引,而Iterator没有这个功能。
综上所述,若只需进行简单的向前遍历并移除元素,使用 Iterator 即可;若需要双向遍历、添加或修改元素,以及获取元素索引,就应使用 ListIterator。