【问题标题】:Initializing an array in Java using the 'advanced' for each loop [duplicate]使用每个循环的“高级”在Java中初始化数组[重复]
【发布时间】:2011-02-03 03:02:25
【问题描述】:

是否可以使用“高级”for 循环在 Java 中初始化数组?

例如

    Integer[ ] numbers = new Integer[20];
    int counter = 0;
    for ( Integer i : numbers )
    {
        i = counter++;
    }

    for ( Integer i : numbers )
    {
        System.out.println(i);
    }

这会打印所有空值,这是为什么呢?

【问题讨论】:

标签: java foreach for-loop


【解决方案1】:

不,因为您没有分配给数组,而是分配给名为i 的临时变量。数组看不到变化。

下面显示了使用普通for 循环的大致等效代码。这应该可以更容易地看出为什么它无法更新数组:

for (int j = 0; j < numbers.length; j++) { 
    Integer i = arr[j]; // i is null here.
    i = counter++; // Assigns to i. Does not assign to the array.
}

【讨论】:

    【解决方案2】:

    你得到空值作为输出的原因是你没有在数组中存储任何值。

    你可以使用foreach循环来初始化数组,但是你必须手动维护一个计数器来引用数组元素:

    for (Integer i : numbers ){
        numbers[counter] = counter;
        counter++;
    }

    显然,这不是 foreach 循环的预期用例。为了解决您的问题,我建议使用“传统” for 循环:

    for (int i = 0; i < numbers.length; i++){
        numbers[i] = i;
    }

    注意,可以使用Arrays.fill(int[] array, int val) 将所有元素填充为相同的值。

    【讨论】:

    • 除非需要,也可以使用 int[] 而不是 Integer[]!
    【解决方案3】:

    基本上没有,不是如你所愿。在“高级”for循环中,无法访问隐藏计数器,也无法对相应的数组槽执行访问。

    【讨论】:

      【解决方案4】:

      “高级”for 循环不会向您公开计数器,因此您无法将 counter++ 的结果写入特定的数组槽。

      您的情况是“高级” for 循环不适合的情况。见:

      http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html

      看看最后一段。

      【讨论】:

        【解决方案5】:

        在你的情况下,你不能。 For-each 隐藏了底层集合上的迭代器,因此当您尝试“初始化”数组时,您无法确定当前在“数字”中的位置。这是“高级”循环不适用的一种用例。

        【讨论】:

          猜你喜欢
          • 2012-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-02
          • 2018-01-11
          • 2017-06-16
          • 1970-01-01
          相关资源
          最近更新 更多