我有一个非常简单的循环:
int[] positions = {1, 0, 0}
//print content of positions
for (int i : positions)
{
if (i <= 0) i = -1;
}
//print content of positions
现在,我期望获得的是:
array: 1, 0, 0
array: 1, -1, -1
但我得到了
array: 1, 0, 0
array: 1, 0, 0
只是......为什么?
亲切的问候, 水母
答案 0 :(得分:19)
因为“i
”是数组元素的副本而不是对它的引用:)
您修改局部变量,而不是数组的元素
此代码相当于
for(int index = 0; index < array.length; index++) {
int i = array[index];
...
}
答案 1 :(得分:2)
这很简单。如果你写
int i = positions[0];
然后按值复制positions[0]
,而不是按引用复制。您无法从positions[0]
修改i
中的原始值。这同样适用于在foreach循环中分配i
。
解决方案没有foreach循环
for (int i = 0; i < positions.length; i++)
{
if (positions[i] <= 0) positions[i] = -1;
}
答案 2 :(得分:2)
如果我们使用带数组的增强型for循环,这会在幕后发生:
int[] array = {1,2,3,4,5};
for($i = 0; $i<array.length; $i++) {
int i = array[$i];
// your statements
if (i <= 0) i = -1;
}
$i
只是一个未命名的内部循环变量的占位符。看看会发生什么:为i
分配一个新值,但i
在下一次迭代中加载了下一个数组项。
因此,实际上,我们不能使用增强型for循环中声明的变量来修改底层数组。
参考:JLS 3.0,14.14.2