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 как стек/очередь — он построен на массиве с эффективным циклическим буфером, быстрее и компактнее по памяти, чем связный список.
• разницу между `add/offer`, `remove/poll`, `element/peek` (если дошёл до 2-го слоя).