Тема 17. Очереди - BelyiZ/JavaCourses GitHub Wiki
Интерфейс Java Queue, java.util.Queue, представляет собой структуру данных, предназначенную для вставки элементов в конец очереди и удаления элементов из начала очереди.
Это похоже на работу очереди в супермаркете.
Интерфейс является подтипом интерфейса Collection, поэтому она обладает всеми функциями of Collection. Все методы в интерфейсе Collection также доступны в интерфейсе Queue.
Он представляет упорядоченную последовательность объектов так же, как список, но его предполагаемое использование немного отличается.
В нем есть методы для доступа к первому элементу или его удаления, а также методы для вставки элемента в очередь.
Если вы хотите получить доступ к определенному элементу, вы должны удалить все предшествующие ему элементы из очереди.
Queue - это Collection, которая позволяет дублировать элементы, но не элементы null.
Возможно выбрать одну из следующих реализаций в API коллекций:
java.util.LinkedList - довольно стандартная реализация очереди;
java.util.PriorityQueue хранит свои элементы внутри в соответствии с их естественным порядком (если они реализуют Comparable) или в соответствии с Comparator, переданным в PriorityQueue.
Есть также реализации Queue в пакете java.util.concurrent.
public interface Queue<E> extends Collection<E>Иерархия классов в группе Queue:

Связь между интерфейсами и классами в группе Queue:

LinkedList - это специальный класс, который принадлежит как группе List, так и группе Queue:

Queue способен упорядочить элементы в очереди по двум основным типам:
-
при помощи полученного в конструкторе интерфейса
Comparator, который сравнивает новые объекты в очереди с предыдущими; -
с помощью интерфейса
Comparable, который необходим для определения натурального порядка элементов. ИнтерфейсQueueописывает коллекции с предопределённым способом вставки и извлечения элементов, а именно — очередиFIFO(first-in-first-out). Помимо методов, определённых в интерфейсеCollection, определяет дополнительные методы для извлечения и добавления элементов в очередь. Большинство реализаций данного интерфейса находится в пакетеjava.util.concurrent. -
PriorityQueue— является единственной прямой реализацией интерфейсаQueue(была добавлена, как и интерфейсQueue, в Java 1.5), не считая классаLinkedList, который так же реализует этот интерфейс, но был реализован намного раньше. Особенностью данной очереди является возможность управления порядком элементов. По-умолчанию элементы сортируются в натуральном порядке, но это поведение может быть переопределено при помощи объекта Comparator, который задаётся при создании очереди. -
ArrayDeque— реализация интерфейса Deque, который расширяет интерфейсQueueметодами, позволяющими реализовать конструкцию видаLIFO(last-in-first-out). -
Интерфейс
Dequeи реализацияArrayDequeбыли добавлены в Java 1.6. Эта коллекция представляет собой реализацию с использованием массивов, подобноArrayList, но не позволяет обращаться к элементам по индексу. Как заявлено в документации, коллекция работает быстрее чемStack, если используется какLIFOколлекция, а также быстрее чемLinkedList, если используется какFIFO.
Когда удобно применять:
- Итерировать все элементы очереди.
- Посмотреть на первый элемент не вынимая его из очереди.
- Извлечение элемента из очереди.
- Добавить элемент в очередь.
- Удалить элемент в очереди.
- Сформировать общую очереди.
Кроме методов, унаследованных от Collection, Queue также имеет свои собственные методы:
Вставляет элемент в Queue:
boolean add(E e) - Если больше нет места для вставки, этот метод создает исключение.
Метод возвращает true, если вставка выполнена успешно
boolean offer(E e) - Если в Queue больше нет пустого места или вставить не удалось, метод возвращает false.

Возвращает первый элемент Queue и удаляет его из Queue:
E remove() - Этот метод создает исключение, если в Queue нет элементов.
E poll() - Этот метод возвращает null, если в Queue нет элементов.

Возвращает первый элемент Queue, но не удаляет его из Queue:
E element() - Этот метод создает исключение, если в Queue нет элементов.
E peek() - Этот метод возвращает null, если в Queue нет элементов.

LinkedList представляет собой традиционную очередь. Метод add/offer добавляют элемент в хвост этой очереди.

Пример:
package org.o7planning.queue.ex;
import java.util.LinkedList;
import java.util.Queue;
public class LinkedListEx1 {
public static void main(String[] args) {
// Create Queue
Queue<String> queue = new LinkedList<String>();
queue.offer("One");
queue.offer("Two");
queue.offer("Three");
queue.offer("Four");
queue.offer("Five");
String current;
while((current = queue.poll())!= null) {
System.out.println(current);
}
}
}Вывод:
One
Two
Three
Four
FivePriorityQueue - это Queue, которая может автоматически сортировать элементы по их приоритетному порядку или по предоставленному Comparator.
Это означает, что элемент, вставленный в PriorityQueue, может находиться не в последней позиции.

Пример:
PriorityQueue<String> сортирует элементы в алфавитном порядке.
PriorityQueueEx1.java
package org.o7planning.queue.ex;
import java.util.PriorityQueue;
import java.util.Queue;
public class PriorityQueueEx1 {
public static void main(String[] args) {
// Создаем Queue
Queue<String> queue = new PriorityQueue<String>();
queue.offer("One");
queue.offer("Two");
queue.offer("Three");
queue.offer("Four");
queue.offer("Five");
String current;
while((current = queue.poll())!= null) {
System.out.println(current);
}
}
}