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 还能反向遍历、插入与替换。

笔记加载中…