Цикл вида foreach. Передача массивов/коллекций

Цикл вида foreach. Передача массивов/коллекций

Элементы массивов примитивных типов и объектов передаются в цикл вида foreach по-разному:
  1. массивы примитивных типов передают свои элементы в foreach по значению
  2. массивы/коллекции объектов передают свои элементы в foreach по копии ссылки
Цикл вида foreach не может инициализировать массив/коллекцию и не может удалять их элементы. Эти операции можно выполнить в цикле for.
foreach не изменяет элементы массивов примитивных типов, т.к. примитивы являются неизменяемыми.


int[] arr = {1, 2, 3, 4, 5};
for (int item : arr) {
        item *= 2;
     } //[1, 2, 3, 4, 5]

В случае объектов foreach воздействует на элементы массива/коллекции через ссылку, что отображается в самом массиве/коллекции.


StringBuilder[] sb = {new StringBuilder("one"), 
                      new StringBuilder("two"),
                      new StringBuilder("three")};
for (StringBuilder item : sb) {
        item.append("!");
     }  // [one!, two!, three!]

foreach воздействует на элемент массива через копию ссылки на объект.


for (StringBuilder item : sb) {
         item = null; 
     } // [one, two, three]
Здесь item - копия ссылки на элемент массива. Только эта копия проинициализирована значением null, а ссылка, являющаяся элементом массива, осталась неизменной.
Условия и Циклы