Является ли интерфейс List в Java двунаправленным или однонаправленным?

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

Ответ

Интерфейс java.util.List в Java является однонаправленным (последовательным). Он предоставляет доступ к элементам по индексу и поддерживает итерацию только в прямом направлении (от начала к концу).

Однако конкретные реализации могут иметь внутреннюю двунаправленную структуру:

Реализация Внутренняя структура Доступ по индексу Итерация
ArrayList Массив O(1) Только вперед (однонаправленная)
LinkedList Двусвязный список (узлы с next и prev) O(n) Вперед/назад (четераторы ListIterator)

Ключевой момент: Хотя LinkedList реализован как двусвязный список, через API интерфейса List он ведет себя как однонаправленная последовательность. Для использования двунаправленных возможностей (добавление/удаление с обоих концов) необходимо использовать интерфейс Deque (который реализует LinkedList).

Пример:

List<String> list = new LinkedList<>();
list.add("A"); // Добавление в конец (однонаправленная операция)
list.get(0); // Медленно O(n), т.к. обход с начала

// Двунаправленные операции доступны через Deque
Deque<String> deque = new LinkedList<>();
deque.addFirst("Start"); // Добавление в начало
deque.addLast("End");    // Добавление в конец
String first = deque.pollFirst(); // Удаление из начала