Почему массив в Java имеет фиксированный размер?

«Почему массив в Java имеет фиксированный размер?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Массивы в Java имеют фиксированный размер, задаваемый при создании, из-за способа выделения памяти. Под массив резервируется один непрерывный блок памяти в куче (heap), что обеспечивает быстрый доступ O(1) по индексу, но делает изменение размера невозможным.

Почему размер нельзя изменить:

  1. Производительность: Непрерывное расположение элементов позволяет вычислять адрес любого элемента за константное время: адрес_элемента[i] = начальный_адрес + i * размер_типа.
  2. Управление памятью: Расширение потребовало бы поиска нового, большего непрерывного блока, копирования всех данных и освобождения старого блока — операция O(n).
  3. Простота и предсказуемость: Фиксированный размер упрощает реализацию JVM и делает использование памяти явным.

Динамическая альтернатива — ArrayList:

// Фиксированный массив
int[] fixedArray = new int[10];
// fixedArray[10] = 11; // ArrayIndexOutOfBoundsException

// Динамический ArrayList (использует массив внутри)
ArrayList<Integer> dynamicList = new ArrayList<>();
dynamicList.add(1); // Автоматически расширяет внутренний массив
// Внутренняя логика: при заполнении создаётся новый массив ~ в 1.5 раза больше

ArrayList абстрагирует работу с массивом, пересоздавая его при необходимости, но это имеет overhead по памяти и производительности при операциях вставки/удаления.