В чем разница между интерфейсами Queue и Deque в Java Collections Framework?

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

Ответ

Queue — интерфейс, представляющий коллекцию, предназначенную для хранения элементов перед обработкой в порядке FIFO (First-In-First-Out), хотя некоторые реализации (например, PriorityQueue) используют другой порядок. Основные операции работают с началом (head) и концом (tail) очереди.

Deque (Double Ended Queue) — интерфейс, который расширяет Queue. Он представляет двустороннюю очередь, позволяющую добавлять, удалять и просматривать элементы с обоих концов. Таким образом, Deque может работать как очередь (FIFO), стек (LIFO) или гибридная структура.

Ключевые отличия:

  • Гибкость: Deque является надмножеством Queue и предоставляет более широкий набор операций.
  • Стек: Deque полностью заменяет устаревший класс Stack, так как его методы push(e), pop(), peek() эффективнее.

Основные методы:

Операция Queue (FIFO) Deque (Двусторонняя)
Добавить add(e) / offer(e) (в конец) addFirst(e) / offerFirst(e) (в начало)
addLast(e) / offerLast(e) (в конец, как у Queue)
Удалить remove() / poll() (с начала) removeFirst() / pollFirst() (с начала, как у Queue)
removeLast() / pollLast() (с конца)
Просмотреть element() / peek() (начало) peekFirst() (начало, как у Queue)
peekLast() (конец)

Пример использования Deque как стека (LIFO):

Deque<String> stack = new ArrayDeque<>();
stack.push("A"); // Добавить в начало [A]
stack.push("B"); // [B, A]
String top = stack.peek(); // "B" (посмотреть)
String popped = stack.pop(); // "B" (удалить с начала), осталось [A]

Пример использования Deque как очереди (FIFO):

Deque<String> queue = new ArrayDeque<>();
queue.offerLast("A"); // Добавить в конец [A]
queue.offerLast("B"); // [A, B]
String first = queue.pollFirst(); // Удалить с начала -> "A", осталось [B]

Распространенные реализации: LinkedList, ArrayDeque (рекомендуется для стека/очереди из-за лучшей производительности).