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

时间:2009-04-06 03:45:41

标签: java foreach

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

    int[] array = new int[5];

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

5 个答案:

答案 0 :(得分:15)

对于这种情况,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;
}

答案 1 :(得分:5)

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

答案 2 :(得分:4)

使用

  

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

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

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:0)

请改为:

int[] array = new int[5];

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