Java中Iterator迭代器的用法详解及案例演示

发布于:2025-04-15 ⋅ 阅读:(24) ⋅ 点赞:(0)

一、基础遍历用法

核心方法hasNext()next()
作用:顺序遍历集合元素

import java.util.ArrayList;
import java.util.Iterator;

public class BasicExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");
        
        Iterator<String> it = list.iterator();
        while(it.hasNext()) {
            String fruit = it.next();
            System.out.println(fruit);
        }
    }
}
// 输出顺序:Apple → Banana → Cherry

说明:通过iterator()方法获取迭代器对象,hasNext()判断是否还有元素,next()获取当前元素并移动指针。


二、安全删除元素

方法remove()
作用:删除当前遍历到的元素,避免并发修改异常

// 正确用法
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String item = it.next();
    if (item.startsWith("B")) {
        it.remove(); // 通过迭代器删除
    }
}
System.out.println(list); // 输出:[Apple, Cherry]

// 错误用法:直接调用集合的remove()
list.remove(item); // 会抛出ConcurrentModificationException

关键点:直接操作集合的增删方法会导致迭代器状态不一致,必须通过迭代器的remove()方法。


三、遍历Map集合

策略:通过entrySet()keySet()values()获取迭代器

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Java", 1);
        map.put("Python", 2);
        
        // 遍历键值对
        Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
        while(it.hasNext()) {
            Map.Entry<String, Integer> entry = it.next();
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
// 输出示例:Java:1  Python:2

说明:Map本身不直接支持迭代器,需通过视图集合转换。


四、ListIterator双向遍历

功能扩展previous(), add(), set()
适用场景:需要反向遍历或修改List元素

List<String> list = Arrays.asList("A", "B", "C");
ListIterator<String> lit = list.listIterator();

// 正向遍历
while(lit.hasNext()) {
    System.out.println(lit.next()); // A → B → C
}

// 反向遍历
while(lit.hasPrevious()) {
    System.out.println(lit.previous()); // C → B → A
}

// 修改元素
lit.next(); // 移动到B
lit.set("X"); // 将B改为X
System.out.println(list); // 输出:[A, X, C]

特点:支持双向移动和元素修改,仅适用于List类型集合。


五、增强for循环底层原理

语法糖:底层基于迭代器实现

for (String fruit : list) {
    System.out.println(fruit);
}
// 等效于:
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String fruit = it.next();
    System.out.println(fruit);
}

限制:增强for循环中不能直接调用remove(),需改用显式迭代器操作。


六、并发修改异常场景

触发条件:迭代过程中直接修改集合结构

Iterator<String> it = list.iterator();
list.add("New Element"); // 结构被修改
it.next(); // 抛出ConcurrentModificationException

解决方案

  1. 使用CopyOnWriteArrayList等并发集合
  2. 通过迭代器自身的修改方法操作。

总结

场景 方法/策略 引用来源
基本遍历 hasNext() + next()
安全删除元素 迭代器的remove()
Map遍历 entrySet().iterator()
双向遍历与修改 ListIterator接口
避免并发异常 禁止直接操作集合的修改方法

通过合理应用迭代器,可以实现对集合的安全高效操作,尤其适合需要动态修改集合内容的场景。