Вопрос с собеседования · Java

Что верно про управление ёмкостью ArrayList?

MiddleКоллекции
Коротко

Ёмкость растёт, но не уменьшается сама; clear() обнуляет ссылки, а массив остаётся прежнего размера. Пустой ArrayList без аргументов выделяет массив лениво — при первом добавлении (10).

  • Известный размер — new ArrayList<>(n), нет промежуточных копирований
  • После массового удаления — trimToSize(), если список живёт долго
  • ensureCapacity — заранее перед пакетом добавлений

А ещё Огромный долгоживущий пустой список держит память

Попробуйте сами

Сколько раз ArrayList копирует массив

Подробно

Внутренний массив у пустого ArrayList ленивый — до первого добавления используется разделяемый пустой массив, и только затем выделяется место под ёмкость по умолчанию. Расти ёмкость умеет, а уменьшаться сама не станет: после удаления миллиона элементов массив останется прежнего размера, поэтому долгоживущий список, переживший пик, продолжит удерживать память — на этот случай есть trimToSize(). clear() проходит по элементам и обнуляет ссылки, чтобы объекты стали собираемыми, но сам массив сохраняет длину.

Что хотят услышать

  • Ленивое выделение, рост, отсутствие уменьшения.
  • Начальная ёмкость и trimToSize.

Частые ошибки

  • Ожидать, что clear() вернёт память.
  • Оставлять долгоживущий список раздутым после пиковой нагрузки.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Если размер известен заранее, стоит задать начальную ёмкость
  • ✓После массового удаления ёмкость сама не уменьшается: нужен trimToSize()
  • ✗clear() освобождает внутренний массив и возвращает ёмкость к нулю, как у только что созданного списка
  • ✓Конструктор без аргументов откладывает выделение массива

Что спросят дальше

  • Почему clear() обнуляет ссылки, а не просто ставит size = 0?
  • Какова ёмкость по умолчанию и когда она выделяется?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования