Ответ
Массивы в Java имеют фиксированный размер, задаваемый при создании, из-за способа выделения памяти. Под массив резервируется один непрерывный блок памяти в куче (heap), что обеспечивает быстрый доступ O(1) по индексу, но делает изменение размера невозможным.
Почему размер нельзя изменить:
- Производительность: Непрерывное расположение элементов позволяет вычислять адрес любого элемента за константное время:
адрес_элемента[i] = начальный_адрес + i * размер_типа. - Управление памятью: Расширение потребовало бы поиска нового, большего непрерывного блока, копирования всех данных и освобождения старого блока — операция
O(n). - Простота и предсказуемость: Фиксированный размер упрощает реализацию JVM и делает использование памяти явным.
Динамическая альтернатива — ArrayList:
// Фиксированный массив
int[] fixedArray = new int[10];
// fixedArray[10] = 11; // ArrayIndexOutOfBoundsException
// Динамический ArrayList (использует массив внутри)
ArrayList<Integer> dynamicList = new ArrayList<>();
dynamicList.add(1); // Автоматически расширяет внутренний массив
// Внутренняя логика: при заполнении создаётся новый массив ~ в 1.5 раза больше
ArrayList абстрагирует работу с массивом, пересоздавая его при необходимости, но это имеет overhead по памяти и производительности при операциях вставки/удаления.