Java Iterator
Iterator 是集合的“迭代器”,负责按顺序逐个取出元素。List、Set 等 Collection 都提供 iterator() 方法,用统一的接口遍历,还能在遍历中安全删除元素。
Iterator 的三个方法
| 方法 | 作用 |
|---|---|
| boolean hasNext() | 是否还有下一个元素 |
| E next() | 返回下一个元素,游标前移 |
| void remove() | 删除刚由 next() 返回的元素 |
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
// 输出:A、B、C(每个元素一行)
遍历时安全删除
一边遍历一边用 list.remove() 删元素会漏删甚至抛异常。正确姿势是用迭代器自己的 remove():
import java.util.ArrayList;
import java.util.Iterator;
public class RemoveDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1); list.add(2);
list.add(3); list.add(4);
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
if (it.next() % 2 == 0) {
it.remove(); // 删除当前元素,安全
}
}
System.out.println(list); // 输出:[1, 3]
}
}
增强 for 的本质
增强 for(for-each)只是语法糖,编译后等价于用 Iterator 遍历:
// for (String s : list) { 处理 s } 编译后等价于:
// Iterator<String> it = list.iterator();
// while (it.hasNext()) { String s = it.next(); 处理 s; }
这也解释了为什么在增强 for 的循环体内直接调用 list.remove() 会抛 ConcurrentModificationException:它破坏了迭代器的状态。
ConcurrentModificationException 简介
集合内部用一个 modCount 记录结构性修改(增删元素)的次数。迭代器创建时会记住当时的计数,每次 next() 前核对,一旦发现计数变了,就抛出并发修改异常,防止遍历结果错乱。规避办法:单线程用迭代器 remove(),多线程用 CopyOnWriteArrayList 等并发容器。
ListIterator 简介
List 专属迭代器,功能更丰富:hasPrevious() / previous() 从后往前遍历;add(e) 在当前位置插入;set(e) 替换当前元素;还能用 nextIndex() / previousIndex() 拿下标。
import java.util.ArrayList;
import java.util.ListIterator;
public class ListItDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("A"); list.add("B");
ListIterator<String> li = list.listIterator();
while (li.hasNext()) {
if (li.next().equals("B")) {
li.set("C"); // 替换当前元素为 C
}
}
System.out.println(list); // 输出:[A, C]
}
}
小结:Iterator 用 hasNext/next/remove 统一遍历各种集合,删除元素要走迭代器自身;增强 for 底层就是 Iterator;List 的 ListIterator 还能反向遍历、插入与替换。