Массивы Java
Массив — объект фиксированной длины с элементами одного объявленного типа и индексами 0..length-1.
int[] numbers = {1, 2, 4, 100};
int third = numbers[2]; // 4
int length = numbers.length; // поле, не методПосле new элементы получают значения по умолчанию: 0, false, '\0' или null. Размер изменить нельзя; для динамического размера нужна коллекция.
Массивы — объекты
Object value = new int[3];
int[] copy = numbers.clone(); // новый массив, примитивы скопированыДля массива ссылок clone() и Arrays.copyOf() делают поверхностную копию: объекты внутри остаются теми же.
Массивы ковариантны и reified:
Number[] values = new Integer[2];
values[0] = 1;
values[1] = 2.5; // ArrayStoreException во время выполненияGenerics, напротив, инвариантны: List<Integer> не является List<Number>, зато ошибка ловится компилятором.
Массивы массивов
Java поддерживает массивы массивов. Строки могут иметь разную длину:
int[][] triangle = {
{1},
{2, 3},
{4, 5, 6}
};
int[][] rectangle = new int[3][4];rectangle выглядит прямоугольным, но физически это внешний массив из трех ссылок на отдельные int[]. Любую строку можно заменить массивом другой длины или null.
Число измерений в типе ограничено форматом JVM, но практический размер массива определяется доступной heap, служебными данными объекта и реализацией JVM. Индекс имеет тип int; запоминать «гарантированный максимум элементов» как одно точное число неверно.
Операции и сложность
- доступ по индексу —
O(1); - поиск без порядка —
O(n); - вставка в середину с сохранением порядка —
O(n)копирований; System.arraycopyкорректно обрабатывает перекрывающиеся диапазоны.
На собеседовании
- Массив — примитив или объект? Объект, даже если хранит примитивы.
- Почему у массива
length, а у Stringlength()? У массива специальное финальное поле; String — обычный класс с методом. - Что копирует
clone()массива объектов? Массив ссылок, не сами объекты. - Есть ли настоящие двумерные массивы? Тип
int[][]есть, реализация — массив массивов, строки могут быть разной длины. - Что такое ArrayStoreException? Runtime-проверка записи несовместимого объекта в ковариантный массив.