Ответ
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 — твой быстрый и надёжный друг, если, конечно, тебе не нужно постоянно ебаться со вставкой в середину.