Перейти к содержимому
Теория · Массивы · урок 1 из 8

Массивы

Чему вы научитесь

Чему вы научитесь:

  • создавать массив, читать и менять его элементы по индексу;
  • обходить массив циклом, печатать и сортировать его через Arrays;
  • объяснять, почему int[] b = a не копирует массив, и правильно сравнивать массивы;
  • работать с двумерным массивом и узнавать число его строк и столбцов.

Представьте ряд одинаковых шкафчиков в раздевалке. На дверце каждого шкафчика написан номер, и по номеру вы находите нужный: «откройте шкафчик 2». Все шкафчики одного размера, а ряд нельзя удлинить: сколько шкафчиков поставили, столько и будет.

Программам часто нужен такой ряд. Пусть нужно хранить баллы трёх игроков. Можно завести три переменные: score1, score2 и score3. Но для сотни игроков понадобится сотня переменных. А выбрать балл игрока по его номеру не получится вовсе: номер здесь — часть имени, а не значение, которое можно вычислить.

Для таких данных в Java есть массив — ряд пронумерованных ячеек под одним именем:

JAVA
public class Main {
    public static void main(String[] args) {
        int[] scores = {90, 75, 60};
        System.out.println(scores[0]);     // 90
        System.out.println(scores[2]);     // 60
        scores[1] = 80;
        System.out.println(scores[1]);     // 80
        System.out.println(scores.length); // 3
    }
}

Давайте разберём программу по строкам:

  1. int[] scores = {90, 75, 60}; создаёт ряд из трёх ячеек и кладёт в них три числа.
  2. scores[0] читает первую ячейку. Номера начинаются с нуля, поэтому печатается 90.
  3. scores[2] — третья, последняя ячейка: 60.
  4. scores[1] = 80; кладёт 80 во вторую ячейку вместо 75.
  5. scores.length — сколько в массиве ячеек: 3.

Что такое массив

Массив — ряд ячеек одного типа под одним именем. Ячейку массива называют элементом, а её номер — индексом. Индекс пишут в квадратных скобках после имени: scores[1].

Тип массива записывают так же, со скобками: int[] читается как «массив int». Массив можно собрать из элементов любого типа: double[], boolean[], String[]. Вы уже видели String[] args в заголовке main — это массив строк.

Каждый элемент ведёт себя как отдельная переменная своего типа:

  • scores[1] в выражении читает значение элемента;
  • scores[1] = 80; кладёт в элемент новое значение, а старое пропадает;
  • в элемент int[] можно положить только int, как в обычную переменную int.

Два способа создать массив

Значения в фигурных скобках

Запись int[] scores = {90, 75, 60}; перечисляет элементы сразу. Длину Java считает сама — по числу значений. Такую запись используют, когда значения известны заранее.

Ряд заданной длины через new

Когда значения появятся позже, массив создают словом new и указывают длину в квадратных скобках. Все элементы такого массива получают значения по умолчанию — те же, что у полей: нули для чисел, false для boolean и null для String.

JAVA
int[] counts = new int[4];
counts[0] = 7;
System.out.println(counts[0]);     // 7
System.out.println(counts[3]);     // 0
System.out.println(counts.length); // 4

Разберём по строкам:

  1. new int[4] создаёт ряд из четырёх ячеек, и в каждой лежит 0.
  2. counts[0] = 7; кладёт 7 в первую ячейку.
  3. counts[3] — последняя ячейка, в неё ничего не клали, поэтому там 0.
  4. counts.length печатает 4.

Индексы от нуля до length - 1

В массиве из трёх элементов индексы 0, 1 и 2. Первый элемент всегда scores[0], а последний — scores[scores.length - 1]. В квадратных скобках может стоять любое выражение типа int, в том числе переменная или вычисление.

Здесь картинка со шкафчиками неточна. В раздевалке номера обычно начинаются с единицы, а в Java — с нуля. Индекс удобно читать как «на сколько шкафчиков отступить от начала ряда»: первый стоит в самом начале, отступ ноль.

Длина массива задаётся при создании и больше не меняется. Добавить четвёртый элемент в массив из трёх нельзя: нужен новый массив большей длины. Длину пишут без круглых скобок: scores.length, а запись scores.length() не скомпилируется.

Частая ошибка

Хотели взять последний элемент, а написали индекс, равный длине:

JAVA
int[] scores = {90, 75, 60};
System.out.println(scores[scores.length]); // ✗
TEXT
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

Программа компилируется: компилятор не следит, какое число окажется в индексе. Ошибку находит JVM уже при запуске. Ячейки с индексом 3 в массиве длины 3 нет, поэтому JVM бросает исключение ArrayIndexOutOfBoundsException и останавливает программу. Последний элемент — scores[scores.length - 1].

Главное

  • Массив — ряд элементов одного типа под одним именем: int[] scores = {90, 75, 60};.
  • Индексы идут от 0 до length - 1: первый элемент scores[0], последний — scores[scores.length - 1].
  • new int[4] создаёт массив из четырёх нулей, и длина массива после создания не меняется.
  • Индекс за границей массива компилируется, но при запуске бросает ArrayIndexOutOfBoundsException.