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

Ответ

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.

Ответ 18+ 🔞

Так, слушай, история про эту вашу Deque, блядь. Представь обычную очередь, как в столовой — зашёл с одного конца, вышел с другого, всё честно, FIFO, First-In-First-Out, ёпта. Скукота.

А теперь представь, что ты в этой очереди — и спереди, и сзади у тебя двери, блядь! Захотел — в начало впендюрился, захотел — в конец пристроился. И выйти можешь откуда угодно! Это и есть Deque, или двусторонняя очередь, хитрая жопа.

В чём, сука, разница между Queue и Deque? Смотри, чтобы не путать:

Что делаем Обычная Queue (односторонняя) Deque (двусторонняя, царица полей)
Запихнуть элемент add(e) (только в хвост) addFirst(e) или addLast(e)
Выдернуть элемент remove() (только с головы) removeFirst() или removeLast()
Подсмотреть peek() (только голову) peekFirst() или peekLast()

Короче, власть абсолютная, ебать. Хочешь — стек организуешь (LIFO), хочешь — очередь (FIFO), а хочешь — вообще цирк с конями, где элементы с обоих концов прыгают.

Кто это, блядь, реализует? Два основных героя:

  • ArrayDeque — на массиве. Шустрый, как угорелый, для стеков и очередей гораздо быстрее LinkedList. Рекомендую, если не нужны твои ебушки-воробушки с доступом по индексу.
  • LinkedList — да, тот самый, на связном списке. Тоже умеет, но если тебе не нужен доступ get(индекс) — зачем он, полупидор, с лишними накладными расходами?

Живой пример, чтобы не быть мудаком:

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

public class DequeExample {
    public static void main(String[] args) {
        // Сделаем из Deque стек (LIFO) — это правильный путь, забей на старый Stack!
        Deque<String> stack = new ArrayDeque<>();
        stack.push("Первый"); // Запихнули в голову
        stack.push("Второй");
        stack.push("Третий");

        System.out.println(stack.pop()); // Вылетит "Третий" (с головы)
        System.out.println(stack.peek()); // Подсмотрим — "Второй"

        // А теперь сделаем обычную очередь (FIFO)
        Deque<String> queue = new ArrayDeque<>();
        queue.offer("Алиса"); // Встала в хвост
        queue.offer("Боб");
        System.out.println(queue.poll()); // Обслужат "Алису" (с головы)
    }
}

Итог, блядь: Deque — это овердохуище гибкости. Нужен стек? push/pop/peek — и не вспоминай про устаревший Stack. Нужна очередь? offer/poll. Нужно впендюрить элемент срочно в самое начало? addFirst(e). ArrayDeque — твой быстрый и надёжный друг, если, конечно, тебе не нужно постоянно ебаться со вставкой в середину.