Тема 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
Five
PriorityQueue
- это 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);
}
}
}