Стоит ли использовать ArrayList для вставки элемента в начало коллекции?

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

Ответ

Нет, это неэффективно. ArrayList реализован на основе массива. Вставка элемента в начало (add(0, element)) требует сдвига всех существующих элементов на одну позицию вправо, что имеет временную сложность O(n).

Почему это медленно:

// Внутренняя логика ArrayList.add(0, element) упрощённо:
public void add(int index, E element) {
    System.arraycopy(innerArray, index, innerArray, index + 1, size - index); // O(n)
    innerArray[index] = element;
}

Когда использовать ArrayList: Для частого доступа по индексу (get/set) и добавления в конец (амортизированное O(1)).

Альтернатива для вставки в начало: Используйте LinkedList, который реализует интерфейс Deque. Вставка в начало (addFirst()) выполняется за O(1), так как требуется только создать узел и обновить ссылки.

LinkedList<String> list = new LinkedList<>();
list.addFirst("New First Element"); // Быстро O(1)