Массивы

Базовый Java
≈ 3 мин чтения

Массив — несколько значений под одним именем

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

int[] temperatures = new int[4];

temperatures[0] = 18;
temperatures[1] = 21;
temperatures[2] = 20;
temperatures[3] = 23;

Запись int[] означает «массив значений типа int», а new int[4] создаёт массив из четырёх элементов. Размер массива задаётся при создании и после этого не меняется.

Индексы начинаются с нуля

Первый элемент массива имеет индекс 0, второй — 1 и так далее. Поэтому у массива из четырёх элементов допустимы индексы от 0 до 3. Через индекс можно и читать значение, и заменять его.

int[] temperatures = {18, 21, 20, 23};

int first = temperatures[0];
temperatures[2] = 24;

System.out.println(first);           // 18
System.out.println(temperatures[2]); // 24

Если обратиться к несуществующему индексу, например temperatures[4], Java завершит эту операцию с ArrayIndexOutOfBoundsException. Поэтому при работе с индексами важно учитывать реальную длину массива.

Создание массива с готовыми значениями

Если значения известны заранее, массив можно создать короче — перечислить элементы в фигурных скобках. Java сама определит размер по количеству значений.

int[] scores = {10, 15, 20, 25};
boolean[] answers = {true, false, true};

Если же создать массив только с размером, его элементы получают значения по умолчанию. Например, элементы int[] начинают с 0, а элементы boolean[] — с false.

Длина массива и перебор элементов

Количество элементов хранится в length. Это удобно в цикле: код не зависит от того, сколько элементов находится в конкретном массиве.

int[] scores = {10, 15, 20, 25};

for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}
У массива length — не метод. Пиши scores.length, без круглых скобок.

Если индекс не нужен и требуется просто пройти по всем значениям, можно использовать цикл for-each.

for (int score : scores) {
    System.out.println(score);
}

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

Массив можно передать в метод

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

static int sum(int[] numbers) {
    int result = 0;

    for (int number : numbers) {
        result += number;
    }

    return result;
}

Вызов sum(new int[]{2, 4, 6}) вернёт 12. Сам метод при этом не знает заранее, сколько элементов ему передадут: он получает длину из самого массива.

Несколько измерений

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

int[][] table = {
    {1, 2, 3},
    {4, 5, 6}
};

System.out.println(table[1][2]); // 6

Здесь table[1] — второй внутренний массив, а table[1][2] — его третий элемент. Для начала достаточно воспринимать многомерный массив как массив, внутри которого лежат другие массивы.

Главное ограничение массива — фиксированный размер. Если создан new int[4], добавить в него пятый элемент нельзя. Когда понадобится структура, размер которой удобно менять во время работы программы, мы познакомимся с коллекциями.