在 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
。