Java:Foreach 循环在 int 数组上无法按预期工作?
我有一个非常简单的循环:
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
……为什么?
亲切的问候, 海蜇
I've got a pretty simple loop:
int[] positions = {1, 0, 0}
//print content of positions
for (int i : positions)
{
if (i <= 0) i = -1;
}
//print content of positions
Now, what I would expect to get is:
array: 1, 0, 0
array: 1, -1, -1
but instead I get
array: 1, 0, 0
array: 1, 0, 0
Just... why?
Kind regards,
jellyfish
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
因为“
i
”是数组元素的副本,而不是对其的引用:)的数组元素
您修改的是局部变量,而不是此代码等效于
Because "
i
" is a copy of an array element and not a reference to it :)You modify a local variable, not an array's element
this code is equivalent to
这很简单。如果你写
然后你通过值复制
positions[0]
,而不是通过引用。您无法修改i
中positions[0]
中的原始值。这同样适用于在 foreach 循环中分配i
。解决方案是不使用 foreach 循环
It's simple. If you write
Then you copy
positions[0]
by value, not by reference. You cannot modify the original value inpositions[0]
fromi
. The same applies to assigningi
within a foreach loop.The solution is without a foreach loop
如果我们使用带有数组的增强型 for 循环,这种情况会在幕后发生:
$i 只是未命名内部循环变量的占位符。看看会发生什么:您为
i
分配了一个新值,但i
在下一次迭代中加载了下一个数组项。因此,实际上,我们不能使用增强 for 循环中声明的变量来修改底层数组。
参考:JLS 3.0,14.14.2
This happens behind the scenes if we use the enhanced for loop with arrays:
$i
is just a placeholder for an unnamed internal loop variable. See what happens: you assign a new value toi
buti
is loaded with the next array item in the next iteration.So, practically spoken, we can't use the variable declared in the enhanced for loop to modify the underlying array.
Reference: JLS 3.0, 14.14.2