Java 对于使用基本体的每个循环修改

Java 对于使用基本体的每个循环修改,java,for-loop,Java,For Loop,(问题1):为什么这个代码段不产生错误,因为它使用for-each循环来修改元素 int arr[] = {0,1,2,3,4,5}; for (int i : arr){ i = 1; } (问题2):即使没有正确使用for-each循环,该代码如何工作。然而,不知何故,所有元素都设置为1 谢谢你的帮助 (问题1):为什么这个代码段不产生错误,因为它使用for-each循环来修改元素 它不修改元素。它所做的是修改变量i,该变量在任何时间点碰巧包含一个元素的副本,但在其他方面与数组完全

(问题1):为什么这个代码段不产生错误,因为它使用for-each循环来修改元素

int arr[] = {0,1,2,3,4,5};
for (int i : arr){
    i = 1;
}
(问题2):即使没有正确使用for-each循环,该代码如何工作。然而,不知何故,所有元素都设置为1

谢谢你的帮助

(问题1):为什么这个代码段不产生错误,因为它使用for-each循环来修改元素

它不修改元素。它所做的是修改变量
i
,该变量在任何时间点碰巧包含一个元素的副本,但在其他方面与数组完全无关

(问题2):即使没有正确使用for-each循环,该代码如何工作

这个循环看起来确实很奇怪,但根本没有什么问题。它相当于以下代码:

 int arr[] = {0,1,2,3,4,5};
  for (int i : arr){
      arr[i] = 1; 
  }
当然,这仅仅是因为
arr
本身恰好包含有效的索引。如果没有(例如,如果
arr[0]=6
),您将获得一个
ArrayIndexOutOfBoundsException

为什么这个代码段不会产生错误,因为它使用for-each循环来修改元素

通过设置
i=1
循环并没有修改底层数组,它只是在循环的迭代中修改虚拟变量
i

即使未正确使用for-each循环,该代码如何工作


通过设置
arr[i]=1
循环恰好将数组中的每个元素设置为1。这是因为数组的值恰好也是数组中的可寻址索引。

Hmm。。在第二种情况下,并发的也不例外modification@nits.kk:为什么会有?撇开这一事实不谈,
ConcurrentModificationException
是一件尽力而为的事情,我不认为这里有任何东西违反了任何合同,不是吗?我认为OP想知道由于并发修改导致的异常。第一种情况不是修改数组,但第二种情况是修改数组…添加来自另一篇文章的链接,用于我的上述评论。。。
arr[0] = 1;
arr[1] = 1;
arr[2] = 1;
arr[3] = 1;
arr[4] = 1;
arr[5] = 1;