Как технически реализуется удаление элемента из массива в Java?

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

Ответ

Поскольку массивы в Java имеют фиксированную длину, прямого удаления элемента не существует. Операция "удаления" реализуется одним из следующих способов:

1. Создание нового массива меньшего размера (вручную):

int[] arr = {10, 20, 30, 40, 50};
int indexToRemove = 2; // Удаляем элемент '30'

int[] newArr = new int[arr.length - 1];
// Копируем часть до удаляемого элемента
System.arraycopy(arr, 0, newArr, 0, indexToRemove);
// Копируем часть после удаляемого элемента
System.arraycopy(arr, indexToRemove + 1, newArr, indexToRemove,
                 arr.length - indexToRemove - 1);
// newArr = [10, 20, 40, 50]

2. Использование ArrayList (рекомендуемый способ): ArrayList внутри использует массив, но предоставляет удобные методы, которые автоматически управляют размером и копированием.

ArrayList<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40, 50));
list.remove(2); // Удаляет элемент с индексом 2 (30)
// Внутри ArrayList сдвигает все последующие элементы влево
// и уменьшает size. Массив elementData может остаться прежнего размера.

Что происходит "под капотом" при удалении из ArrayList (метод remove(int index)):

  • Проверяется индекс.
  • Элементы справа от удаляемого сдвигаются на одну позицию влево (через System.arraycopy).
  • Последняя ячейка массива обнуляется (elementData[--size] = null).
  • Вместимость (capacity) при этом обычно не уменьшается.