Что будет менее производительным при вставке элемента в конец списка: ArrayList или LinkedList?

«Что будет менее производительным при вставке элемента в конец списка: ArrayList или LinkedList?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

LinkedList будет менее производительным для вставки в конец, несмотря на одинаковую теоретическую сложность O(1).

Причины:

  • ArrayList: Вставка в конец — амортизированное O(1). Элементы хранятся в непрерывном массиве. Операция add() обычно просто присваивает значение в следующую ячейку. Расширение внутреннего массива (копирование) происходит редко.
  • LinkedList: Вставка в конец — O(1), но требует:
    1. Создания нового объекта Node.
    2. Обновления ссылок next у последнего узла и previous у нового.
    3. Эти операции плохо используют кэш процессора из-за разрозненного размещения узлов в памяти.

Практический пример:

// ArrayList - обычно быстрее
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(100); // Быстрое присваивание в массив

// LinkedList - медленнее из-за накладных расходов
LinkedList<Integer> linkedList = new LinkedList<>();
linkedList.add(100); // Выделение памяти под Node, обновление ссылок

Вывод: Для сценариев частого добавления в конец ArrayList предпочтительнее.