Карта / Коллекции / Queue и Deque

Queue и Deque

Queue — очередь: первым пришёл, первым ушёл (FIFO). Как очередь в магазине: кто встал раньше, того и обслужат раньше.

Queue<String> line = new LinkedList<>();
line.offer("Артур");   // добавить в конец
line.offer("Борис");
line.poll();             // "Артур" — забрали из начала

Deque (double-ended queue) — очередь с двух сторон. Можно добавлять и убирать и с начала, и с конца:

Deque<String> stack = new ArrayDeque<>();
stack.push("a");   // добавить в начало
stack.push("b");
stack.pop();         // "b" — убрали с начала (LIFO — последним пришёл, первым ушёл)

Deque универсальна: умеет вести себя и как очередь (FIFO), и как стек (LIFO) — зависит от того, какими методами пользуешься.

Копнуть глубже

Таблица методов — у Queue/Deque есть пары методов: одни кидают исключение при ошибке, другие возвращают специальное значение:

ДействиеКидает исключениеВозвращает значение
добавитьadd()offer()
убрать и вернутьremove()poll()
посмотреть без удаленияelement()peek()

На практике почти всегда используют безопасную версию (offer/poll/peek) — она не роняет программу исключением, если очередь пуста или полна, а просто возвращает null/false.

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

🎤 Закрыл тему, если можешь объяснить:
• разницу FIFO (`Queue`) и LIFO, и что особенного в `Deque`;
• разницу между `add/offer`, `remove/poll`, `element/peek` (если дошёл до 2-го слоя).