Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Изменение

Как уже было сказано, в отличие от длины, значения внутри массива могут меняться со временем(говорят "изменять свое состояние"). Сам цикл при изменении остается тем же самым, меняется только его тело. Предположим, что перед нами стоит задача некой нормализации имен предметов. Допустим, в нормализацию входит приведение имен к нижнему регистру. Тогда код будет выглядеть так:

String[] items = {"Table", "Chair", "Bed"};

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

String.toLowerCase() это стандартаная функция приведения к нижнему регистру.

Здесь ключевая строчка это items[i] = items[i].toLowerCase(); В ней происходит перезапись элемента под индексом i. Иногда полезно создать промежуточную переменную для упрощения анализа кода:

String lowerCaseItem = items[i].toLowerCase();
items[i] = lowerCaseItem;

На данном примере можно показать что не всегда можно применить краткую форму, например запись

String[] items = {"Table", "Chair", "Bed"};        
for (String item : items) {
    item = item.toLowerCase();
}

не будет иметь смысла: переменная item меняется, но результат ее изменения в массив не записывается, потому что мы изменяем некую временную переменную, а не член массива.

Изменение состояния(мутабельность) и бездна проблем

Важно обратить внимание на то, что изменение состояния очень часто приводит к проблемам и нужно быть осторожными. Например в примере выше массив items в первоначальном виде с заглавными буквами

String[] items = {"Table", "Chair", "Bed"};

может также использоваться в дальнейшем. Очевидным решением будет создать для первоначального массива еще одну переменную, а потом уже привести к нижнему регистру:

String[] items = {"Table", "Chair", "Bed"};
String[] lowerCaseItems = items;
for (int i = 0; i < lowerCaseItems.length; i++) {
    lowerCaseItems[i] = lowerCaseItems[i].toLowerCase(); 
}
System.out.println(Arrays.toString(lowerCaseItems));// => [table, chair, bed]

Но запись String[] lowerCaseItems = items; не создает нового массива, будет всего лишь создана переменная lowerCaseItems указывающая на тот же самый массив, поэтому после изменения элементов lowerCaseItems данные в items также изменятся! Для избегания таких нелепых ошибок лучшим решением будет создание новой коллекции с данными из старой:

public static String[] toLowerCase(String[] ar) {
    String[] result = new String[ar.length];
    for (int i = 0; i < ar.length; i++) {
        result[i] = ar[i].toLowerCase();
    } 
    return result;
}

String[] items = {"Table", "Chair", "Bed"};
String[] lowerCaseItems = toLowerCase(items);

System.out.println(Arrays.toString(lowerCaseItems));// => [table, chair, bed]
System.out.println(Arrays.toString(items));// => [Table, Chair, Bed]

Копирование

В стандартной библиотеке есть метод Arrays.copyOf который позволяет избежать поэлементного копирования массивов:

import java.util.Arrays;

String[] ar = {"line", "line", "line"};
String[] copy  = Arrays.copyOf(ar, ar.length);

ar[0] = "modified";

System.out.println(Arrays.toString(ar)); // => [modified, line, line]
System.out.println(Arrays.toString(copy)); // => [line, line, line]
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →