Что происходит внутри ArrayList при вызове метода clear()?

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

Ответ

Метод clear() выполняет две основные операции:

  1. Обнуляет ссылки: Все элементы внутреннего массива (elementData) в диапазоне [0, size) устанавливаются в null. Это позволяет сборщику мусора удалить сами объекты, если на них больше нет других ссылок.
  2. Сбрасывает размер: Поле size устанавливается в 0.

Важно: Вместимость (capacity) массива elementData не изменяется. Память, выделенная под массив, не освобождается.

Пример (упрощенная логика из JDK):

public void clear() {
    modCount++; // Инкремент счётчика структурных изменений
    for (int i = 0; i < size; i++) {
        elementData[i] = null; // Шаг 1: обнуление ссылок
    }
    size = 0; // Шаг 2: сброс размера
}

Практический совет: Если после clear() список долго не будет использоваться или нужно сильно сократить потребление памяти, можно вызвать trimToSize(). Этот метод создаст новый массив минимальной длины, освободив память старого большого массива.

list.clear();
list.trimToSize(); // Теперь elementData.length == 0 (или близко к 0)