Queue и Deque
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 обычно легко читать.
ArrayDeque даёт современные операции
push(), pop() и peek().