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

Posted

技术标签:

【中文标题】Java:Foreach 循环在 int 数组上没有按预期工作? [复制]【英文标题】:Java: Foreach loop not working as expected on int array? [duplicate] 【发布时间】:2011-08-28 00:41:12 【问题描述】:

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

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

只是……为什么?

亲切的问候, 水母

【问题讨论】:

【参考方案1】:

因为“i”是数组元素的副本,而不是对它的引用 :) 您修改的是局部变量,而不是数组的元素

这段代码相当于

for(int index = 0; index < array.length; index++) 

int i = array[index];
...

【讨论】:

我花了很长时间才找到这个答案......我有一个数组,正在 foreach 中实例化对象,稍后用索引访问它们,我得到空指针异常。所以 for 和 foreach 不一样...【参考方案2】:

这很简单。如果你写

int i = positions[0];

然后你按值复制positions[0],而不是按引用。您不能从i 修改positions[0] 中的原始值。这同样适用于在 foreach 循环中分配 i

解决方案是没有foreach循环

for (int i = 0; i < positions.length; i++)

    if (positions[i] <= 0) positions[i] = -1;

【讨论】:

【参考方案3】:

如果我们对数组使用增强的 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

【讨论】:

以上是关于Java:Foreach 循环在 int 数组上没有按预期工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java数组使用以及foreach循环

java基础 Foreach循环

java使用foreach语句遍历二维数组如何实现?

Java 输出数组的方法

java中for循环的特殊:foreach的使用

java二维数组foreach语句问题 for(int x:a) if(x==a.length) //不是很明白