Java Iterator 和 ListIterator
Iterator
模块 java.base 软件包 java.util
Interface Iterator<E>
参数类型 E - 此迭代器返回的元素类型
public interface Iterator<E>
Iterator 是一个接口,它是集合的迭代器。Iterator 提供的 API 接口如下:
boolean hasNext() 如果迭代具有更多元素,则返回 true 。
E next() 返回迭代中的下一个元素。
default void remove() 从底层集合中移除此迭代器返回的最后一个元素(可选操作)。
default void forEachRemaining(Consumer<? super E> action) 对每个剩余元素执行给定操作,直到处理完所有元素或操作引发异常。
import java.util.*;
ArrayList<String> a = new ArrayList<String>();
a.add("aaa");
a.add("bbb");
a.add("ccc");
System.out.println("Before iterate : " + a);
Iterator<String> it = a.iterator();
while (it.hasNext()) {
// for (Iterator it = a.iterator();it.hasNext();){
String t = it.next();
if ("bbb".equals(t)) { it.remove(); }
}
System.out.println("After iterate : " + a); // 注意 使用 for 这里会引发异常
注意:
- Iterator 只能单向移动;
- Iterator.remove() 是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次 next() 方法,remove() 方法只能被调用一次,如果违反这个规则将抛出一个异常。
ListIterator
模块 java.base 软件包 java.util
Interface ListIterator<E>
All Superinterfaces:
Iterator<E>
public interface ListIterator<E> extends Iterator<E>
列表的迭代器,允许程序员在任一方向上遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。 ListIterator 没有当前元素;它的光标位置总是位于调用 previous() 返回的元素和调用 next() 返回的元素之间。 长度为 n 的列表的迭代器具有 n + 1 可能的光标位置,如下面的^ ( ^ )所示:
请注意, remove() 和 set(Object) 方法未根据光标位置定义; 它们被定义为对 next() 或 previous() 调用返回的最后一个元素进行操作。
此接口是 Java Collections Framework 的成员。
void add(E e) 将指定的元素插入列表(可选操作)。
boolean hasNext() 如果此列表迭代器在向前遍历列表时具有更多元素,则返回 true 。
boolean hasPrevious() 如果此列表迭代器在反向遍历列表时具有更多元素,则返回 true 。
E next() 返回列表中的下一个元素并前进光标位置。
E previous() 返回列表中的上一个元素并向后移动光标位置。
int nextIndex() 返回后续调用 next()将返回的元素的索引。
int previousIndex() 返回后续调用 previous()将返回的元素的索引。
void remove() 从列表中删除 next()或 previous() (可选操作)返回的最后一个元素。
void set(E e) 用指定的元素替换 next()或 previous()返回的最后一个元素(可选操作)。
声明方法的接口 java.util.Iterator
forEachRemaining
ListIterator 是一个功能更加强大的,它继承于 Iterator 接口,只能用于各种 List 类型的访问。可以通过调用 listIterator() 方法产生一个指向 List 开始处的 ListIterator,还可以调用 listIterator(n) 方法创建一个一开始就指向列表索引为 n 的元素处的 ListIterator。
ArrayList<String> a = new ArrayList<String>();
a.add("aaa");
a.add("bbb");
a.add("ccc");
System.out.println("Before iterate : " + a);
ListIterator<String> it = a.listIterator();
while (it.hasNext()) {
System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());
}
while (it.hasPrevious()) {
System.out.print(it.previous() + " ");
}
System.out.println();
it = a.listIterator(1);
while (it.hasNext()) {
String t = it.next();
System.out.println(t);
if ("ccc".equals(t)) { it.set("nnn"); }
else { it.add("kkk"); }
}
System.out.println("After iterate : " + a);
// Before iterate : [aaa, bbb, ccc]
// aaa, 0, 1
// bbb, 1, 2
// ccc, 2, 3
// ccc bbb aaa
// bbb
// ccc
// After iterate : [aaa, bbb, kkk, nnn]