代码之家  ›  专栏  ›  技术社区  ›  masher

为什么每个循环都不起作用?[副本]

  •  5
  • masher  · 技术社区  · 15 年前

    在这段代码中,为什么我的数组没有按我希望的那样初始化?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 回复  |  直到 15 年前
        1
  •  15
  •   Eddie    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不能用于初始化 一次一个。for each中的变量是 数组或集合引用的代理。编译器不会替换您的“ i int i array[index] ".

    例如,如果您有一个日期数组,并尝试此操作,则代码:

    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;
    }
    
        2
  •  5
  •   Nikhil    15 年前

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

        3
  •  4
  •   PH.    15 年前

    使用

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

        4
  •  3
  •   Uri    15 年前

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

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

        5
  •  0
  •   euphoria83    15 年前

    改为这样做:

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