为什么这个for-each循环不起作用?

在这段代码中,为什么我的数组不是按照我想要的那样初始化的? for-each循环是不是设计成这样做的,还是我只是没有正确使用它?

int[] array = new int[5]; //initialise array -> Doesn't work! Array still full of 0's for(int i : array) i = 24; 

for-each循环不适用于这种情况。 您不能使用for-each循环来初始化数组。 你的代码:

 int[] array = new int[5]; for (int i : array) { i = 24; } 

将翻译成以下内容:

 int[] array = new int[5]; for (int j = 0; j < array.length; j++) { int i = array[j]; i = 24; } 

如果这是一个对象数组,它仍然会失败。 基本上,for-each依次将集合或数组中的每个条目分配给您提供的变量,然后您可以使用该变量。 该变量等于数组引用。 它只是一个变量。

For-each不能用于初始化任何数组或Collection,因为它遍历数组或Collection的当前内容,每次为您提供一个 。 for-each中的变量不是数组或Collection引用的代理。 编译器不会将“ i ”(来自“ int i ”)替换为“ array[index] ”。

例如,如果您有一个Date数组,请尝试以下代码:

 Date[] array = new Date[5]; for (Date d : array) { d = new Date(); } 

会被翻译成这样的东西:

 Date[] array = new Date[5]; for (int i = 0; i < array.length; i++) { Date d = array[i]; d = new Date(); } 

你可以看到它不会初始化数组。 最终将得到一个包含所有空值的数组。

注意:我使用上面的代码,将其编译成.class文件,然后使用jad对其进行反编译。 此过程为我提供了以下代码,由上面的代码中的Sun Java编译器(1.6)生成:

 int array[] = new int[5]; int ai[]; int k = (ai = array).length; for(int j = 0; j < k; j++) { int i = ai[j]; i = 5; } 

i只是数组中该点的int副本,而不是对它的引用。 for-each循环在这种情况下不起作用。

使用

java.util.Arrays.fill(array, 24)

如果你要初始化为相同的值。 除此之外,Eddie在他的for-each结构的翻译中非常注重。

int是系统中的基本类型,因此您实际上获得了数组中单元格值的副本,而不是对可以分配到的数组中该单元格的引用….

让我试着解释一下。 如果您有一个X数组,其中X是一个具有数据成员的类,您将在每次迭代中获得对不同单元格的引用,并且能够通过调用其上的函数来更改其状态(例如,setValue) 。

当你有一个不同的故事,你的int不是一个引用,它是一个堆栈上的实际值,因为它是一个原始类型,所以在每次迭代中,for将一个值从数组复制到i中。 然后更新你的i,但这对arrays没有影响。

改为:

 int[] array = new int[5]; // initialise array -> Will work now for(int i = 0 ; i< array.length ; i++) array[i] = 24 ;