在这段代码中,为什么我的数组没有按照我的意愿进行初始化?是 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 不能用于初始化任何数组或集合,因为它循环遍历数组或集合的当前内容,一次为您提供每个值。for-each 中的变量不是数组或集合引用的代理。编译器不会用“”替换您的“ 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 时,情况就不同了,您的 int 不是引用,它是堆栈上的实际值,因为它是原始类型,因此在每次迭代中,for 将数组中的值复制到 i 中。然后你更新你的 i,但这对数组没有影响。
改为这样做:
int[] array = new int[5];
// initialise array -> Will work now
for(int i = 0 ; i< array.length ; i++)
array[i] = 24 ;