Тема 17. Очереди - BelyiZ/JavaCourses GitHub Wiki

Содержание:

  1. Интерфейс Queue
  2. Методы
  3. LinkedList(Queue)
  4. PriorityQueue
  5. Список литературы/курсов

Интерфейс Queue

Интерфейс 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(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

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);
       }
    }
}

Список литературы/курсов

  1. https://java-blog.ru/collections/queue-java
  2. https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html
  3. https://javascopes.com/java-queue-7f6bf05c/
  4. https://java-blog.ru/collections/queue-java

Тема 16. Списки | Оглавление | Тема 18. Карты

⚠️ **GitHub.com Fallback** ⚠️