iterator 是专为安全遍历集合设计的标准接口,支持遍历时安全删除元素;传统 for 适合索引敏感操作;增强 for 本质是 iterator 语法糖,简洁但无法删除元素。

Java 中 Iterator 和 for 循环(含传统 for 和增强 for)本质目标一致:遍历数据。但它们在设计目的、能力边界和适用场景上差异明显,选错可能引发异常、逻辑错误或性能问题。
Iterator 是专为安全遍历集合而生的接口
Iterator 不是语法糖,而是集合框架提供的标准访问协议。它把“怎么取下一个元素”和“能不能删当前元素”封装成可信赖的操作:
- 所有实现 Iterable 接口的集合(List、Set、Queue 等)都必须提供 iterator() 方法,返回一个 Iterator 实例
- 通过 hasNext() 和 next() 控制遍历节奏,不依赖索引,也不暴露底层结构
- 唯一能在遍历时安全删除当前元素的方式:调用 iterator.remove(),不会触发 ConcurrentModificationException
- 支持更精细控制,比如配合条件提前退出、跳过某些元素、或与 ListIterator 一起实现双向遍历
传统 for 循环适合索引敏感操作
传统 for(for(int i = 0; i )本质是基于下标访问,天然适用于需要位置信息的场景:
- 要修改指定索引处的元素(如 list.set(i, newValue))
- 需同时访问相邻元素(如比较 list.get(i) 和 list.get(i+1))
- 需按特定步长、倒序或分段遍历(如每两个取一个、从末尾往前处理)
- 对 ArrayList 效率略高(因支持 O(1) 随机访问),但对 LinkedList 效率极低(每次 get(i) 都是 O(n))
增强 for 循环(for-each)是 Iterator 的语法糖,简洁但有硬限制
写法最简:for (String s : list),可读性最强。但它背后就是 Iterator,因此继承了 Iterator 的能力,也受限于它的约束:
- 不能获取当前索引(除非额外声明计数器变量)
- 不能在循环体内调用 list.remove() 或 list.add(),否则运行时抛出 ConcurrentModificationException
- 不能用于需要中途跳出并保留迭代状态的复杂流程(比如嵌套遍历中要复用同一迭代逻辑)
- 对数组和所有 Iterable 集合通用,代码一致性好,日常只读遍历首选
怎么选?看这三点就清楚了
要删元素?→ 必须用 Iterator(增强 for 和传统 for 都不行)
要靠下标做事?→ 用传统 for(比如重排、替换、滑动窗口)
只是打印、校验、转换?→ 优先增强 for(简洁、不易错、语义明确)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











