Что такое Deque в Java и чем он отличается от Queue?

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

Ответ

Deque (Double Ended Queue) в Java — это интерфейс из пакета java.util, представляющий двустороннюю очередь. В отличие от обычной Queue (очереди), которая поддерживает операции FIFO (First-In-First-Out) только с одного конца, Deque позволяет добавлять и удалять элементы с обоих концов (головы и хвоста).

Ключевые отличия от Queue: Операция Queue (Одна сторона) Deque (Две стороны)
Добавление add(e), offer(e) (в хвост) addFirst(e), addLast(e), offerFirst(e), offerLast(e)
Удаление remove(), poll() (с головы) removeFirst(), removeLast(), pollFirst(), pollLast()
Просмотр element(), peek() (голова) getFirst(), getLast(), peekFirst(), peekLast()

Основные реализации:

  • ArrayDeque — реализация на основе массива. Быстрее LinkedList в большинстве сценариев использования в качестве стека или очереди.
  • LinkedList — также реализует интерфейс Deque, но основан на двусвязном списке.

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

import java.util.ArrayDeque;
import java.util.Deque;

public class DequeExample {
    public static void main(String[] args) {
        // Использование Deque как стека (предпочтительнее устаревшего Stack)
        Deque<String> stack = new ArrayDeque<>();
        stack.push("First"); // Добавить в начало (голову)
        stack.push("Second");
        stack.push("Third");

        System.out.println(stack.pop()); // "Third" (удалить с головы)
        System.out.println(stack.peek()); // "Second" (посмотреть голову)

        // Использование Deque как очереди (FIFO)
        Deque<String> queue = new ArrayDeque<>();
        queue.offer("First"); // Добавить в хвост
        queue.offer("Second");
        System.out.println(queue.poll()); // "First" (удалить с головы)
    }
}

Почему это важно: Deque предоставляет более гибкую абстракцию, чем Queue, и является рекомендуемой заменой устаревшего класса Stack (используйте push/pop/peek). ArrayDeque не имеет накладных расходов на синхронизацию и обычно работает быстрее, чем Stack или LinkedList.