
for-each 循环(增强型 for 循环)仅支持遍历读取数组或集合元素,其内部使用的是值拷贝机制,对循环变量的赋值不会影响原数组,因此无法用于输入或修改数组内容。
for-each 循环(增强型 for 循环)仅支持遍历读取数组或集合元素,其内部使用的是值拷贝机制,对循环变量的赋值不会影响原数组,因此无法用于输入或修改数组内容。
在 Java 中,for-each 循环(如 for (int ele : marks))本质上是只读遍历。它的工作原理是:每次迭代时,将数组当前索引位置的元素值复制给一个局部变量(此处为 ele),该变量独立于数组本身。因此,即使你对 ele 赋新值(如 ele = sc.nextInt()),也只是修改了这个临时副本,原数组 marks[i] 的内存位置并未被触达,数组内容始终保持初始化默认值(int 类型为 0)。
以下代码清晰展示了问题所在:
for (int ele : marks) {
ele = sc.nextInt(); // ❌ 错误:仅修改局部变量 ele,marks 数组未改变
}
执行过程示意(以 marks = [0, 0, 0] 为例):
- 第1次迭代:ele 被赋值为 marks[0] 的副本(即 0),然后 ele 改为用户输入的 23 → 但 marks[0] 仍是 0
- 第2次迭代:ele 被赋值为 marks[1] 的副本(0),再改为 45 → marks[1] 仍为 0
- 同理,marks[2] 始终未被更新
✅ 正确做法:使用传统 for 循环配合下标直接访问并赋值:
import java.util.Scanner;
public class JavaArrays {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] marks = new int[3];
// ✅ 使用索引明确修改数组元素
for (int i = 0; i <p>⚠️ 注意事项:</p>
- for-each 适用于不需要索引、不修改源数据的遍历场景(如打印、求和、查找等);
- 若需修改数组/集合元素、依赖索引逻辑(如交换、跳跃访问)、或遍历过程中需控制步长,请务必使用传统 for 循环或 while;
- 对于 ArrayList 等集合,for-each 同样不能用于结构修改(如 remove()),否则会抛出 ConcurrentModificationException。
总结:for-each 是语法糖,设计初衷是提升遍历可读性与安全性,而非替代索引操作。理解其“值传递”本质,是避免此类逻辑陷阱的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











