Массивы 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, а у String length()? У массива специальное финальное поле; String — обычный класс с методом.
  • Что копирует clone() массива объектов? Массив ссылок, не сами объекты.
  • Есть ли настоящие двумерные массивы? Тип int[][] есть, реализация — массив массивов, строки могут быть разной длины.
  • Что такое ArrayStoreException? Runtime-проверка записи несовместимого объекта в ковариантный массив.