为什么这个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 ;