请逐步解析这段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次循环(i=0):
- 取
n = a[0] = 1 - 执行
a[1] = 0→ 数组变成:[1, 0, 3, 4, 1]
- 取
第2次循环(i=1):
- 取
n = a[1] = 0 - 执行
a[0] = 0→ 数组变成:[0, 0, 3, 4, 1]
- 取
第3次循环(i=2):
- 取
n = a[2] = 3 - 执行
a[3] = 0→ 数组变成:[0, 0, 3, 0, 1]
- 取
第4次循环(i=3):
- 取
n = a[3] = 0(注意这里已经是被修改后的值了!) - 执行
a[0] = 0→ 索引0本来就是0,数组无变化,还是[0, 0, 3, 0, 1]
- 取
第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,提问作者Дмитрий Б
相关产品推荐
相关产品推荐

