Массивы
Чему вы научитесь:
- создавать массив, читать и менять его элементы по индексу;
- обходить массив циклом, печатать и сортировать его через
Arrays; - объяснять, почему
int[] b = aне копирует массив, и правильно сравнивать массивы; - работать с двумерным массивом и узнавать число его строк и столбцов.
Представьте ряд одинаковых шкафчиков в раздевалке. На дверце каждого шкафчика написан номер, и по номеру вы находите нужный: «откройте шкафчик 2». Все шкафчики одного размера, а ряд нельзя удлинить: сколько шкафчиков поставили, столько и будет.
Программам часто нужен такой ряд. Пусть нужно хранить баллы трёх игроков. Можно завести три переменные: score1, score2 и score3. Но для сотни игроков понадобится сотня переменных. А выбрать балл игрока по его номеру не получится вовсе: номер здесь — часть имени, а не значение, которое можно вычислить.
Для таких данных в 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
}
}Давайте разберём программу по строкам:
int[] scores = {90, 75, 60};создаёт ряд из трёх ячеек и кладёт в них три числа.scores[0]читает первую ячейку. Номера начинаются с нуля, поэтому печатается90.scores[2]— третья, последняя ячейка:60.scores[1] = 80;кладёт80во вторую ячейку вместо75.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.
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Разберём по строкам:
new int[4]создаёт ряд из четырёх ячеек, и в каждой лежит0.counts[0] = 7;кладёт7в первую ячейку.counts[3]— последняя ячейка, в неё ничего не клали, поэтому там0.counts.lengthпечатает4.
Индексы от нуля до length - 1
В массиве из трёх элементов индексы 0, 1 и 2. Первый элемент всегда scores[0], а последний — scores[scores.length - 1]. В квадратных скобках может стоять любое выражение типа int, в том числе переменная или вычисление.
Здесь картинка со шкафчиками неточна. В раздевалке номера обычно начинаются с единицы, а в Java — с нуля. Индекс удобно читать как «на сколько шкафчиков отступить от начала ряда»: первый стоит в самом начале, отступ ноль.
Длина массива задаётся при создании и больше не меняется. Добавить четвёртый элемент в массив из трёх нельзя: нужен новый массив большей длины. Длину пишут без круглых скобок: scores.length, а запись scores.length() не скомпилируется.
Частая ошибка
Хотели взять последний элемент, а написали индекс, равный длине:
int[] scores = {90, 75, 60};
System.out.println(scores[scores.length]); // ✗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.