You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请逐步解析这段Java增强for循环代码的输出结果及原因

为啥这段Java增强for循环的输出是00301?

嘿,我来帮你一步步拆解这段代码的运行逻辑,看完你就能明白为啥输出是00301啦!

先把代码贴出来方便对照:

public class My { 
    public static void main(String[] args) { 
        int[] a = {1,2,3,4,1}; 
        for (int n : a) { 
            a[n] = 0; 
        } 
        for (int n : a) { 
            System.out.println(n); 
        } 
    } 
}

首先得明确:Java里的增强for循环遍历数组时,底层等价于按索引从0到数组末尾的普通for循环,编译后会变成类似这样的代码:

int[] arr = a;
for (int i = 0; i < arr.length; i++) {
    int n = arr[i];
    a[n] = 0;
}

(这里的arr是原数组的引用,所以修改a的元素会直接影响arr的内容)

接下来我们跟着每一步循环走,看看数组是怎么变化的:

初始数组状态

数组a的索引和对应元素:

  • 索引0 → 1
  • 索引1 → 2
  • 索引2 → 3
  • 索引3 → 4
  • 索引4 → 1
    也就是数组内容:[1, 2, 3, 4, 1]

第一个增强for循环的每一步

  1. 第1次循环(i=0):

    • 取n = a[0] = 1
    • 执行a[1] = 0 → 数组变成:[1, 0, 3, 4, 1]
  2. 第2次循环(i=1):

    • 取n = a[1] = 0
    • 执行a[0] = 0 → 数组变成:[0, 0, 3, 4, 1]
  3. 第3次循环(i=2):

    • 取n = a[2] = 3
    • 执行a[3] = 0 → 数组变成:[0, 0, 3, 0, 1]
  4. 第4次循环(i=3):

    • 取n = a[3] = 0(注意这里已经是被修改后的值了!)
    • 执行a[0] = 0 → 索引0本来就是0,数组无变化,还是[0, 0, 3, 0, 1]
  5. 第5次循环(i=4):

    • 取n = a[4] = 1
    • 执行a[1] = 0 → 索引1本来就是0,数组依旧是[0, 0, 3, 0, 1]

第二个增强for循环输出

遍历最终的数组[0, 0, 3, 0, 1],依次输出每个元素,就得到了00301。

最后提醒个容易踩坑的点:增强for循环遍历数组时,每次取的是数组对应索引的实时值,不是初始值。循环中修改数组元素会影响后续循环的n取值(比如第4次循环的n就是被修改后的0)。

内容的提问来源于stack exchange,提问作者Дмитрий Б

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:05:04