📅  最后修改于: 2023-12-03 14:42:56.199000             🧑  作者: Mango
在Java中,集合类和映射类都支持使用Iterator来进行迭代操作。双端迭代器(或者称为ListIterator)是一种特殊的迭代器,它比普通的Iterator更加强大,主要表现在可以在迭代过程中双向移动。
List接口继承了Collection接口,因此List类型的集合都可以使用双端迭代器。我们可以通过List接口的listIterator()方法来获取一个ListIterator对象:
List<String> list = new ArrayList<>();
ListIterator<String> iterator = list.listIterator();
另外,还可以通过List接口的listIterator(int index)方法来获取指定位置上的ListIterator对象:
List<String> list = new ArrayList<>();
ListIterator<String> iterator = list.listIterator(2);
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);
}
除了常见的Iterator方法(hasNext, next, remove)之外,ListIterator还提供了一些新的方法。hasPrevious()和previous()可以用来检查和获取上一个元素, nextIndex()和previousIndex()可以用来获取迭代器的当前位置, set()和add()则可以用来修改和添加元素。
假设现在有一个存放String类型的List集合,需要我们从集合中删除一个或多个指定的元素,可以考虑使用Iterator迭代器。
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (element.equals("A") || element.equals("B")) {
iterator.remove();
}
}
但是,如果这个List集合被重复使用,那么再次调用iterator()时就会返回一个新的Iterator实例,集合中原有的元素还未被删除,这使得要删除的元素可能并不在迭代器中,这种情况下,可以考虑使用ListIterator双端迭代器。
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("A");
ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (element.equals("A") || element.equals("B")) {
iterator.remove();
}
}
这个例子中,我们使用了ListIterator,遍历List的时候,同时可以使用它的remove()方法进行元素的删除,而不会像使用Iterator那样同时破坏了List的结构。