增强for循环以提升开发效率为核心,语法简洁、可读性强、性能与传统循环持平,适用于只读遍历;但禁止边遍历边修改集合,需注意空值、类型匹配及适用场景限制。

增强 for 循环(for-each)是 Java 中最常用的遍历工具之一,它不追求“高性能突破”,而是通过语法简化和语义明确来实现高效——这里的“高效”主要指开发效率高、出错率低、可读性强。它在底层对数组用索引访问,对集合用迭代器,性能与手写传统循环基本持平,没有额外开销。
只读遍历时,它就是最高效的写法
当你只需要逐个访问元素、做计算、打印、校验或构建新结构时,增强 for 是首选。它省去索引变量、长度判断、next()/hasNext()调用,代码更短、逻辑更聚焦。
- 遍历 int[]:直接读值,无装箱开销 ——
for (int x : arr) { sum += x; } - 遍历 ArrayList
:类型安全,编译期检查 —— for (String s : list) { if (s.startsWith("A")) count++; } - 遍历 HashSet
:无需关心顺序,自动覆盖所有元素 - 遍历 Map 的键或值:必须转成 keySet() / values() / entrySet() ——
for (Map.Entry<string integer> e : map.entrySet())</string>
不能边遍历边修改集合结构
这是最关键限制:在增强 for 中调用 list.remove() 或 set.add() 会立即抛 ConcurrentModificationException。这不是线程问题,而是 Java 集合的 fail-fast 机制在起作用。
- 想安全删除符合条件的元素?用
iterator.remove()或 JDK 8+ 的list.removeIf(predicate) - 想边遍历边添加?先收集待加元素到临时容器,遍历结束后再
addAll() - 数组不受此限(长度固定),但注意:改循环变量
x不会影响原数组,因为基本类型传的是值副本
注意空值和类型匹配细节
增强 for 对 null 很敏感,也对泛型类型很严格,稍不注意就会编译失败或运行时报错。
- 遍历前建议判空:
if (list != null && !list.isEmpty()) { for (...) {...} } - 变量类型必须兼容元素类型:声明
Object可以接String[],但声明int接String[]直接编译失败 - 遍历
Integer[]时用int会自动拆箱,若含null则运行时 NPE;用Integer则无此风险,但有装箱开销 -
HashMap本身不能直接遍历,必须用map.keySet()、map.values()或map.entrySet()
不适合的场景,别硬套
增强 for 的简洁是以牺牲灵活性为代价的。以下情况应换用传统 for 或迭代器:
- 需要当前元素索引(比如做下标相关计算、构造带序号的日志)
- 要反向遍历、跳过某些元素、或中途多次重置迭代位置
- 需并行遍历两个数组/集合(增强 for 一次只能处理一个)
- 遍历多维数组:外层可用,内层仍需嵌套增强 for 或传统循环 ——
for (int[] row : matrix) { for (int val : row) {...} }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











