基本类型数组的for-each循环修改相关技术问询
关于Java for-each循环的两个常见问题解答
问题1:为何使用for-each循环修改元素的这段代码不会产生错误?
先看这段代码:
int arr[] = {0,1,2,3,4,5}; for (int i : arr){ i = 1; }
这段代码完全符合Java语法规范,所以编译器不会报错,但它对原数组不会产生任何实际修改效果。核心原因是:for-each循环里的i是数组对应位置元素的副本,不是指向原数组元素的引用。每次循环迭代时,Java会把当前数组元素的值复制到i这个局部变量中,你修改i的值只是改变了这个临时变量,和原数组里的元素没有任何关联——就像你复印了一份文档,在复印件上改内容,原文档根本不会受影响。
问题2:这段未正确使用for-each循环的代码,为何能将数组所有元素设为1?其运行机制是什么?
对应的代码如下:
int arr[] = {0,1,2,3,4,5}; for (int i : arr){ arr[i] = 1; }
这纯粹是巧合,因为你初始数组的元素值刚好和它们对应的索引值完全一致。我们来拆解具体运行过程:
- 初始数组为
{0,1,2,3,4,5},数组索引范围是0到5。 - Java的for-each遍历数组,本质上等价于普通的索引循环:
for (int k = 0; k < arr.length; k++) { int i = arr[k]; arr[i] = 1; } - 第一次迭代:
k=0,i=arr[0]=0,执行arr[0] = 1,数组变为{1,1,2,3,4,5}。 - 第二次迭代:
k=1,i=arr[1]=1,执行arr[1] = 1,数组无变化。 - 第三次迭代:
k=2,i=arr[2]=2,执行arr[2] = 1,数组变为{1,1,1,3,4,5}。 - 后续迭代以此类推,直到
k=5时,i=arr[5]=5,执行arr[5] = 1,最终所有元素都被设为1。
但这种写法是错误的,完全依赖初始数组的巧合。如果初始数组是{1,0,2,3,4,5},第一次迭代i=1会修改arr[1]为1,第二次迭代i=arr[1]=1又修改arr[1],arr[0]永远不会被触及,根本达不到“所有元素设为1”的目的。正确修改数组所有元素的方式,应该直接用索引循环。
内容的提问来源于stack exchange,提问作者user9249390
相关产品推荐
相关产品推荐

