Queue и Deque

Базовый Java
≈ 2 мин чтения

Queue: обработка по очереди

Queue<E> описывает структуру, из которой элементы обычно забирают в порядке их обработки. Для обычной очереди это принцип FIFO: first in, first out — кто пришёл первым, тот первым и выходит.

Queue<String> tasks = new ArrayDeque<>();
tasks.offer("build");
tasks.offer("test");
tasks.offer("deploy");

System.out.println(tasks.poll()); // build
System.out.println(tasks.peek()); // test

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

Две группы методов

У очереди есть похожие операции с разным поведением при невозможности выполнить действие. add(), remove() и element() сообщают о проблеме исключением, а offer(), poll() и peek() используют специальный результат. Для обычной обработки очереди в прикладном коде часто удобнее вторая группа.

Deque: доступ с двух концов

Deque<E> расширяет идею очереди: элементы можно добавлять и забирать как с начала, так и с конца. Поэтому одна и та же структура подходит и для очереди, и для стека.

Deque<String> history = new ArrayDeque<>();
history.addLast("page-1");
history.addLast("page-2");
history.addFirst("start");

System.out.println(history.removeFirst()); // start
System.out.println(history.removeLast());  // page-2

Названия First и Last делают сторону операции явной, поэтому код с Deque обычно легко читать.

Для обычного стека чаще выбирай Deque, а не старый класс Stack. Например, ArrayDeque даёт современные операции push(), pop() и peek().