Java:Foreach循环在int数组上没有按预期工作?

时间:2011-05-18 12:26:36

标签: java arrays loops foreach

我有一个非常简单的循环:

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

只是......为什么?

亲切的问候, 水母

3 个答案:

答案 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

相关问题