Ответ
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 (рекомендуется для стека/очереди из-за лучшей производительности).