2009-04-06 9 views
5

В этом коде, почему мой массив не инициализирован так, как я этого хочу? Является ли цикл for-each не предназначен для этого, или я просто не использую его правильно?Почему этот цикл для каждого цикла не работает?

int[] array = new int[5]; 

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

Разве другой вопрос не должен дублироваться? Это было первым. – masher

ответ

14

Цикл for-each не будет работать для этого случая. Вы не можете использовать цикл for для каждого цикла для инициализации массива. Код:

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-каждый не может быть использован для инициализации любого массива или коллекции, так как он перебирает текущее содержимое массива или коллекции, давая вам каждый значение поштучно. Переменная in a 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(); 
} 

, который, как вы можете видеть, будет не инициализировать массив. Вы получите массив, содержащий все значения null.

ПРИМЕЧАНИЕ: Я взял код выше, скомпилировал его в файл .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; 
} 
+0

На самом деле, не переводит ли он в цикл while с итератором? –

+0

Я не пытаюсь дать точный перевод, но чувствую, почему он не работает. – Eddie

+0

имеет смысл. Приветствия. – masher

3

прерывания INT примитивный тип в системе, так что вы на самом деле получаете копию значения ячейки в массиве, а не ссылку на эту ячейку в массиве, который можно назначить в ....

Позвольте мне попытаться объяснить это. Если у вас есть массив Xs, где X - класс, в котором есть члены данных, вы бы получили ссылку на другую ячейку на каждой итерации и могли бы изменять свое состояние, вызывая функции на нем (например, setValue) ,

Когда у вас есть ints, это совсем другая история, ваш int не является ссылкой, это фактическое значение в стеке, так как это примитивный тип, поэтому на каждой итерации для копирования значения из массива в i , Затем вы обновляете свой i, но это не влияет на массив.

+0

Это не совсем причина отказа. Он не имеет ничего общего с тем, что он был примитивным. Вы не можете использовать for-each для инициализации * любого * массива, независимо от того, является ли его содержимое примитивным или нет. – Eddie

+0

Если ваш класс не имеет явного setValue(), который вы хотите вызвать. – Uri

+0

Если вы используете массив объектов, этот код не будет инициализировать массив. Это не имеет никакого отношения к переменной, являющейся примитивной. – Eddie

5

i - это просто копия int в этой точке массива, а не ссылка на нее. В этом случае цикл для каждого цикла не работает.

0

ли это вместо:

int[] array = new int[5]; 

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

Я не хотел каждый раз выписывать все это. Похоже, я не могу с этим справиться .. :( – masher

+0

добро пожаловать в повторяющийся аспект типизации жизни программиста – euphoria83

4

Использование

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

, если вы собираетесь быть инициализацией к тому же стоимость. Кроме этого, Эдди очень много внимания уделяет переводу каждой конструкции.

+0

славно! Я собираюсь использовать этот класс с этого момента! – masher

Смежные вопросы