2016-03-20 3 views
5

Я не понимаю, почему я не могу назначить значения элементам массива с использованием цикла for for. Например, используя цикл, как этотEnhanced for loop не работает для назначения значений массиву (Java)

int[] array = new int[5]; 
    for(int i = 0; i < 5; i++) 
     array[i] = 10; 

производит то, что я хочу. Но почему это не работает с «для каждого»:

for(int element : array) 
     element = 10; 

Есть ли конкретная причина, почему это так, или я делаю что-то не так?

ответ

8

В расширенном цикле element - это локальная переменная, содержащая ссылку (или значение в случае примитивов) текущему элементу массива или Iterable, который вы выполняете.

Присвоение ему не влияет на массив/Iterable.

Это эквивалентно:

int[] array = new int[5]; 
for(int i = 0; i < 5; i++) { 
    int element = array[i]; 
    element = 10; 
} 

Который также не будет изменять массив.

Если вам нужно изменить массив, используйте обычный цикл цикла.

0

Усовершенствованный цикл используется:

for(int element : array) 
    element = 10; 
  1. В Java есть ссылки, ссылающихся на объект. В то время одна ссылка может ссылаться только на один объект. Если он сделан для ссылки на другой объект, то он утрачивает ссылку на предыдущую. При использовании = тогда вы делаете element ссылаться на другое значение т.е. 10.

  2. Здесь element имеет type int, который primitive типа. Даже если было Integer, то также Integer, являющееся immutable, вы бы не вносили никаких изменений в объект, так как изменения всегда приводили к отдельному объекту.

Если бы дело, как показано ниже для некоторых пользовательского класса говорят Student.java Для некоторого List<Student> students.

for(Student std : students){ 
    std.setName("eureka"); 
} 

Теперь итерация списка и печать имени каждого студента будет иметь привел к печати eureka для каждого студента. Но обратите внимание, что даже в этом случае использование = привело бы к тому же результату, который вы получаете сейчас (так как вы снова указали переменную на другой объект, она больше не будет ссылаться на исходный объект списка).

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