一、什么是迭代器迭代器是 Java 集合框架中的一种设计模式它的核心作用是提供一种统一的方式遍历集合中的元素而不需要暴露集合内部的实现细节。你可以把它想象成一个游标一开始指向集合的第一个元素之前通过调用方法可以逐个移动游标并获取元素遍历完成后游标指向集合末尾二、入门级讲解基本用法1. 核心接口定义Java 中所有迭代器都实现了java.util.Iterator接口核心方法只有三个public interface IteratorE { // 判断是否还有下一个元素 boolean hasNext(); // 获取下一个元素调用前必须先判断hasNext() E next(); // 删除当前迭代到的元素可选操作 default void remove() { throw new UnsupportedOperationException(remove); } }2. 最简单的遍历示例以最常用的ArrayList为例演示基础遍历流程import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorBasicDemo { public static void main(String[] args) { ListString fruits new ArrayList(); fruits.add(苹果); fruits.add(香蕉); fruits.add(橙子); // 1. 获取迭代器 IteratorString iterator fruits.iterator(); // 2. 遍历集合 while (iterator.hasNext()) { String fruit iterator.next(); System.out.println(当前水果 fruit); // 可选删除符合条件的元素注意不能用集合的remove方法 if (香蕉.equals(fruit)) { iterator.remove(); } } System.out.println(删除香蕉后的集合 fruits); } }运行结果当前水果苹果 当前水果香蕉 当前水果橙子 删除香蕉后的集合[苹果, 橙子]三、实战进阶实用场景与避坑指南1. 遍历中安全删除元素⚠️关键注意点在迭代过程中不能直接调用集合的remove()方法否则会抛出ConcurrentModificationException并发修改异常。必须使用迭代器自身的remove()方法。错误示例// 错误写法遍历中直接修改集合 for (String fruit : fruits) { if (香蕉.equals(fruit)) { fruits.remove(fruit); // 会抛出异常 } }2. 增强 for 循环与迭代器的关系Java 的增强 for 循环for-each本质上是迭代器的语法糖编译后会自动转换成迭代器遍历// 等价于上面的迭代器写法 for (String fruit : fruits) { System.out.println(fruit); }3. 反向迭代器ListIterator对于有序集合如ArrayList可以使用ListIterator实现双向遍历import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorDemo { public static void main(String[] args) { ListInteger numbers new ArrayList(); numbers.add(1); numbers.add(2); numbers.add(3); // 获取从末尾开始的迭代器 ListIteratorInteger iterator numbers.listIterator(numbers.size()); // 反向遍历 while (iterator.hasPrevious()) { Integer num iterator.previous(); System.out.println(反向遍历 num); } } }运行结果反向遍历3 反向遍历2 反向遍历14. 迭代器的应用场景遍历各种集合List、Set、Map 的 entrySet/keySet 等在遍历中安全删除元素统一不同集合的遍历方式不管是 ArrayList 还是 HashSet都用同样的迭代器接口四、优缺点与特点总结特性详细说明✅优点1. 统一遍历接口无需关心集合内部实现2. 遍历中安全删除元素3. 支持单向/双向遍历ListIterator4. 解耦集合与遍历逻辑❌缺点1. 只能单向遍历普通 Iterator不能随机访问2. 遍历过程中不能修改集合除了迭代器自身的 remove 方法3. 比普通 for 循环基于索引的性能略低对 ArrayList 这类随机访问集合核心特点1.迭代器是一次性的遍历完成后需要重新获取才能再次遍历2. 快速失败Fail-Fast机制如果在迭代过程中集合被修改会立即抛出异常五、类似遍历方式对比遍历方式适用场景性能可修改性迭代器 Iterator所有集合类型需要在遍历中删除元素中等LinkedList 比索引遍历快仅支持迭代器的 remove()增强 for 循环仅需要读取元素不需要修改与迭代器一致不能修改集合普通 for 循环索引仅支持有序集合List需要随机访问对 ArrayList 最快可以直接修改集合但遍历中删除会导致元素索引混乱forEach() 方法Java 8函数式编程风格仅读取元素与迭代器一致不能修改集合会抛出异常对比示例// 1. 普通索引遍历仅适用于List for (int i 0; i fruits.size(); i) { System.out.println(fruits.get(i)); } // 2. Java 8 forEach 方法 fruits.forEach(fruit - System.out.println(fruit));