Iterator 迭代器、ListIterator  foreach 循环 一、Iterator 迭代器接口1. 基础说明包java.util.Iterator使用前需要导入作用通用遍历 Collection 集合依靠指针游标跟踪元素游标初始位置第一个元素的前面泛型说明不写泛型时取出元素默认是Object类型需要强制类型转换推荐使用泛型避免强转2. 核心方法方法功能描述boolean hasNext()判断游标后面是否还有下一个元素只判断不移动指针E next()返回下一个元素同时将指针向后移动一位void remove()删除迭代器最后访问到的元素迭代器自带删除遍历流程课件图示顺序 ① hasNext () 判断有元素 → ② next () 取值 指针后移 ③ hasNext () 判断有元素 → ④ next () 取值 指针后移 ⑤ hasNext () 判断有元素 → ⑥ next () 取值 指针后移 ⑦ hasNext () 判断无元素循环结束3. 基础代码示例import java.util.ArrayList; import java.util.Iterator; public class TestIterator { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(张三); list.add(李四); list.add(王五); IteratorString it list.iterator(); while (it.hasNext()) { String s it.next(); System.out.println(s); } } }4. 重点并发修改异常ConcurrentModificationException✅ 课件要点迭代器遍历期间如果调用集合对象自己的 remove ()/add ()修改集合长度继续遍历就抛出并发修改异常错误写法集合 removewhile (it.hasNext()){ String s it.next(); if(李四.equals(s)){ list.remove(s); // ❌ 集合方法报异常 } }正确写法迭代器自带 removewhile (it.hasNext()){ String s it.next(); if(李四.equals(s)){ it.remove(); // ✅ 迭代器删除安全 } }原理集合维护modCount修改计数器迭代器记录初始值expectedModCount两者不一致触发异常。5. Iterator 局限只能单向向后遍历没有添加、替换元素的方法只能用于 Collection。二、ListIteratorList 专属迭代器Iterator 的子接口只用于 List 集合功能比普通 Iterator 更强支持双向遍历、增删改、获取索引1. 主要特性双向遍历可以向前、向后遍历修改能力遍历中添加、删除、替换元素索引支持可以获取当前元素对应索引2. 全套方法表方法描述next()返回下一个元素光标后移previous()返回前一个元素光标前移hasNext()判断是否存在下一个元素hasPrevious()判断是否存在前一个元素nextIndex()返回下一个元素的索引previousIndex()返回前一个元素的索引remove()删除光标前的元素set(E e)替换光标前的元素add(E e)在光标当前位置插入元素3. 简单示例反向遍历import java.util.ArrayList; import java.util.ListIterator; public class TestListIterator { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(A); list.add(B); list.add(C); ListIteratorString lit list.listIterator(); // 先走到末尾 while (lit.hasNext()){ lit.next(); } // 反向遍历 while (lit.hasPrevious()){ System.out.println(lit.previous()); } } }三、foreach 循环增强 for 循环1. 基础介绍foreach 是简化版 for 循环底层依然是 Iterator 迭代器语法糖适用范围数组、所有实现Iterable的 Collection 集合 语法格式for(容器中元素类型 临时变量 : 容器变量) { 执行语句 }示例ArrayListString list new ArrayList(); list.add(A); list.add(B); for(String s : list){ System.out.println(s); } int[] arr {1,2,3}; for(int num : arr){ System.out.println(num); }2. 课件重点缺陷foreach 循环只能访问元素不能修改集合结构增删循环里的临时变量是元素副本修改临时变量不会改变原集合 / 数组里面的值遍历途中调用集合 add/remove → 并发修改异常没有索引不知道当前遍历位置四、四种遍历方式汇总对比Iterator / ListIterator / 增强 for / Lambda forEach遍历方式底层方向增删改是否有索引适用场景Iterator迭代器单向向后✅ it.remove()❌通用 Collection遍历中删除ListIteratorList 专属迭代器双向✅ add/remove/set✅List 集合反向遍历、边遍历边修改增强 for foreachIterator 语法糖单向向后❌ 不能增删集合❌单纯遍历代码简洁集合.forEach (Lambda)函数式接口单向❌ 不能增删集合❌JDK8简洁对每个元素执行操作五、易错点总结hasNext()只判断不移动指针不能连续多次调用next()容易NoSuchElementException泛型缺失时Iterator 取出元素是 Object需要强制转换ListIterator只能 List 获取Set 集合不能使用增强 for 只是语法糖编译后依然变成 Iterator同样不能在遍历时直接调用集合增删方法