Нет, поскольку вы не назначаете массив, вы назначаете временную переменную с именем i
. Массив не видит изменений.
Ниже показан примерно эквивалентный код с использованием обычного цикла для
. Это должно помочь понять, почему не удается обновить массив:
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.
}
В вашем случае вы не можете. For-each скрывает итератор в базовой коллекции, поэтому здесь вы не можете понять, в какой позиции в «числах» вы сейчас находитесь, когда пытаетесь «инициализировать» массив. Это один из вариантов использования, для которого не предназначен "расширенный" цикл.
В основном нет, не так, как вам хочется. В «расширенном» цикле for нет способа получить доступ к скрытому счетчику, равно как и выполнить доступ для записи в соответствующий слот массива.
«Расширенный» цикл for не предоставляет вам счетчик, и, следовательно, вы не можете записать результат counter ++
в конкретный слот массива.
Ваш случай - это случай, когда «расширенный» цикл for не предназначен для. См .:
http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Обратите внимание на последний абзац.
Причина, по которой вы получаете нулевые значения на выходе, заключается в том, что вы не храните никаких значений в массиве.
Вы можете использовать цикл 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).