增强for循环适用于只读遍历,能自动处理边界检查、降低出错概率;但无法直接修改原数组元素,因循环变量是副本,基本类型赋值不影响原数组,引用类型重新赋值也不改变数组内容。

增强 for 循环(for-each)是 Java 中遍历数组最直观、安全的方式,它把注意力从“怎么取”转向“取什么”,大幅降低出错概率。但它的优雅有前提——用对场景、避开常见误区。
只读遍历:它最擅长的事
当你只需要逐个访问元素、做打印、求和、校验或转换操作时,增强 for 就是最优解。它自动处理边界检查,不会越界,代码也更贴近自然语言表达。
- 整数数组求和:int sum = 0; for (int x : nums) sum += x;
- 字符串数组转大写并收集:List
upper = new ArrayList(); for (String s : words) upper.add(s.toUpperCase()); - 判断是否存在某值:boolean hasZero = false; for (int n : arr) if (n == 0) { hasZero = true; break; }
不能改原数组?原因和应对
增强 for 中的循环变量是元素的副本。对基本类型赋值(如 num = 100)完全不影响原数组;对引用类型,调用方法(如 str.trim())可能生效,但让变量指向新对象(如 str = "new")也不会改变数组内容。
- ✅ 正确修改方式:用传统 for 循环配合索引,for (int i = 0; i
- ⚠️ 注意:即使使用 var(Java 10+),也不能绕过这个限制,for (var x : arr) x = ... 依然无效
空值与嵌套:两个易漏的防御点
增强 for 不做 null 安全包装。数组本身为 null,或二维数组中某一行是 null,都会直接抛 NullPointerException。
- 一维数组判空:if (arr != null) for (int x : arr) {...}
- 二维数组需双重防护:if (matrix != null) for (int[] row : matrix) if (row != null) for (int v : row) {...}
- 不规则二维数组(如每行长度不同)可正常遍历,row.length 仍有效,无需额外适配
索引缺失?简单补救不伤简洁
它不提供下标,但真需要序号或位置逻辑时,不必退回复杂写法。加一个外部计数器即可保持语义清晰:
- int idx = 0; for (String s : names) { System.out.println(idx + ": " + s); idx++; }
- 若需频繁用索引,或逻辑依赖位置(如跳过前 N 个、只处理偶数位),传统 for 仍是更直接的选择
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











