Queue Java – интерфейс очереди
Интерфейс Java Queue, java.util.Queue, представляет собой структуру данных, предназначенную для вставки элементов в конец очереди и удаления элементов из начала очереди. Это похоже на работу очереди в супермаркете.
Интерфейс является подтипом интерфейса Collection. Он представляет упорядоченную последовательность объектов так же, как список, но его предполагаемое использование немного отличается.
Реализации
Будучи подтипом Collection, все методы в интерфейсе Collection также доступны в интерфейсе Queue.
Поскольку Queue является интерфейсом, вам необходимо создать конкретную реализацию, чтобы использовать его. Вы можете выбрать одну из следующих в API коллекций:
Есть также реализации Queue в пакете java.util.concurrent, но оставим утилиты параллелизма вне этого урока.
Как добавить элемент
Для добавления элементов в очередь вызывается ее метод add (). Этот метод наследуется от интерфейса коллекции.
Как получить элемент
Порядок, в котором элементы, добавленные в очередь, хранятся внутри, зависит от реализации. То же самое верно для порядка, в котором элементы извлекаются из очереди.
Как посмотреть на первый элемент
Вы можете посмотреть на элемент в начале очереди, не вынимая его из очереди, element() или метода peek().
Метод element() возвращает первый элемент в очереди. Если очередь пуста, вызывает исключение NoSuchElementException.
После выполнения этого кода переменная firstElement будет содержать элемент value 1, который является первым элементом в очереди.
Peek() работает так же, как метод element (), за исключением того, что он не создает исключение, если очередь пуста. Вместо этого он просто возвращает null. Вот пример:
Как итерировать все элементы?
Вы также можете перебирать все элементы очереди, а не просто обрабатывать по одному за раз.
При выполнении итерации очереди через ее итератор или цикл for-each (который также использует итератор), последовательность, в которой элементы итерируются, зависит от реализации очереди.
Как удалить элемент?
Вызывается метод remove(). Он удаляет элемент в начале очереди. В большинстве реализаций начало и конец очереди находятся на противоположных концах. Однако возможно реализовать интерфейс очереди, чтобы заголовок и конец находились в одном конце. В этом случае у вас будет стек.
Общая очередь
По умолчанию вы можете поместить любой объект в очередь, но начиная с Java 5, Generics позволяет ограничить типы объектов, которые вы можете вставить в нее. Вот вам пример:
Теперь в эту очередь могут быть вставлены только экземпляры MyObject. Затем вы можете получить доступ к его элементам и повторить их без приведения. Вот как это выглядит:
Что такое queue java
The offer method inserts an element if possible, otherwise returning false. This differs from the Collection.add method, which can fail to add an element only by throwing an unchecked exception. The offer method is designed for use when failure is a normal, rather than exceptional occurrence, for example, in fixed-capacity (or «bounded») queues.
The remove() and poll() methods remove and return the head of the queue. Exactly which element is removed from the queue is a function of the queue’s ordering policy, which differs from implementation to implementation. The remove() and poll() methods differ only in their behavior when the queue is empty: the remove() method throws an exception, while the poll() method returns null.
The element() and peek() methods return, but do not remove, the head of the queue.
The Queue interface does not define the blocking queue methods, which are common in concurrent programming. These methods, which wait for elements to appear or for space to become available, are defined in the BlockingQueue interface, which extends this interface.
Queue implementations generally do not define element-based versions of methods equals and hashCode but instead inherit the identity based versions from class Object, because element-based equality is not always well-defined for queues with the same elements but different ordering properties.
This interface is a member of the Java Collections Framework.
Очередь Java – Очередь на Java
Очередь Java – это интерфейс, доступный в пакете java.util и расширяющий java.util.Интерфейс сбора данных. Как и список Java, очередь Java представляет собой набор
Очередь Java – это интерфейс, доступный в пакете java.util и расширяющий java.util.Интерфейс сбора данных. Как и список Java, очередь Java представляет собой набор упорядоченных элементов (или объектов), но она выполняет операции вставки и удаления по-разному. Мы можем использовать очередь для хранения элементов перед обработкой этих элементов.
Очередь Java
В этом разделе мы обсудим некоторые важные моменты, касающиеся очереди Java:
Диаграмма классов очередей Java
Интерфейс очереди Java расширяет интерфейс сбора. Интерфейс сбора расширяет итерационный интерфейс. Некоторые из часто используемых классов реализации очереди-LinkedList, PriorityQueue, ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue и т. Д. AbstractQueue предоставляет скелетную реализацию интерфейса очереди для уменьшения усилий при реализации очереди.
Методы очереди Java
В этом разделе мы обсудим некоторые полезные и часто используемые методы очереди Java:
Основы очереди Java
Поскольку очередь Java расширяет коллекцию Java, она также поддерживает все операции интерфейса коллекции. Давайте рассмотрим некоторые простые операции в следующем примере:
Массив Java в очередь
Здесь мы можем изучить, как преобразовать массив Java в очередь с помощью метода “Collections.addAll()” с помощью одного простого примера.
Вывод:- Когда мы запустим вышеуказанную программу, мы получим следующий вывод:
Очередь Java в массив
Здесь мы рассмотрим, как преобразовать очередь Java в массив Java с помощью “toArray()” на одном простом примере.
Вывод:- Когда мы запустим вышеуказанную программу, мы получим следующий вывод:
Общие операции очереди Java
Очередь Java поддерживает все операции, поддерживаемые интерфейсом сбора, и некоторые другие операции. Он поддерживает почти все операции в двух формах.
В следующей таблице кратко описаны все распространенные операции с очередями.
| Вставить | предложение(e) | добавить(e) |
| Удалять | опрос() | удалить() |
| Исследовать | заглянуть() | элемент() |
Мы рассмотрим каждую операцию и подробно обсудим их с некоторыми полезными примерами в следующих разделах.
Операции Вставки очереди Java
В этом разделе мы подробно обсудим операцию вставки очереди Java с некоторыми полезными примерами. Если эта операция выполняется успешно, она возвращает значение “true”. Как мы знаем, очередь поддерживает операцию вставки в двух формах:
Он создает исключение, если операция завершается неудачно.
Он возвращает специальное значение в случае сбоя операции.
ПРИМЕЧАНИЕ:- Здесь специальное значение может быть либо “false”, либо “null”
Операция добавления очереди()
Операция add() используется для вставки нового элемента в очередь. Если он успешно выполняет операцию вставки, он возвращает значение “true”. В противном случае он выбрасывает java.lang.Исключение незаконного состояния.
Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.
Вывод:- Когда мы запустим вышеуказанную программу, мы получим следующий вывод:
Поскольку наша очередь ограничена двумя элементами, когда мы пытаемся добавить третий элемент с помощью BlockingQueue.add(), он создает исключение, как показано выше.
Операция предложения очереди()
Операция предложения() используется для вставки нового элемента в очередь. Если он успешно выполняет операцию вставки, он возвращает значение “true”. В противном случае он возвращает значение “false”.
Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.
Вывод:- Когда мы запустим вышеуказанную программу, мы получим следующий вывод:
Поскольку наша очередь ограничена двумя элементами, когда мы пытаемся добавить третий элемент с помощью BlockingQueue.операция offer() возвращает значение “false”, как показано выше.
Операции Удаления очереди Java
В этом разделе мы подробно обсудим операцию удаления очереди Java с некоторыми полезными примерами. Операции удаления возвращают головной элемент очереди, если он успешно выполняется. Как мы знаем, очередь поддерживает операцию удаления в двух формах:
Он создает исключение, если операция завершается неудачно.
Он возвращает специальное значение в случае сбоя операции.
ПРИМЕЧАНИЕ:- Здесь специальное значение может быть либо “false”, либо “null”
Операция удаления очереди()
Операция удаления() используется для удаления элемента из головы очереди. Если он успешно выполняет операцию удаления, он возвращает головной элемент очереди. В противном случае он создает исключение java.util.NoSuchElementException.
Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.
Вывод:- Когда мы запустим вышеуказанную программу, мы получим следующий вывод:
Поскольку наша очередь состоит только из двух элементов, когда мы пытаемся вызвать метод remove() в третий раз, он выдает исключение, как показано выше.
ПРИМЕЧАНИЕ:- Queue.remove(элемент) используется для удаления указанного элемента из очереди. Если он успешно выполняет операцию удаления, он возвращает значение “true”. В противном случае он возвращает значение “false”.
Операция опроса очереди()
Операция опроса() используется для удаления элемента из головы очереди. Если он успешно выполняет операцию удаления, он возвращает головной элемент очереди. В противном случае он возвращает значение “null”.
Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.
Вывод:- Когда мы запустим вышеуказанную программу, мы получим следующий вывод:
Поскольку наша очередь состоит только из двух элементов, когда мы пытаемся вызвать метод poll() в третий раз, он возвращает нулевое значение, как показано выше.
Операции проверки очереди Java
В этом разделе мы подробно обсудим операции проверки очереди Java с некоторыми полезными примерами. Если эта операция выполняется успешно, она возвращает головной элемент очереди, не удаляя его. Как мы знаем, очередь поддерживает операцию проверки в двух формах:
Он создает исключение, если операция завершается неудачно.
Он возвращает специальное значение в случае сбоя операции.
ПРИМЕЧАНИЕ:- Здесь специальное значение может быть либо “false”, либо “null”
Операция элемента очереди()
Операция element() используется для извлечения элемента из головы очереди без его удаления. Если он успешно выполняет операцию проверки, он возвращает головной элемент очереди. В противном случае он создает исключение java.util.NoSuchElementException.
Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.
Вывод:- Когда мы запустим вышеуказанную программу, мы получим следующий вывод:
Если мы попытаемся вызвать метод element() в пустой очереди, он вызовет исключение, как показано выше.
Операция просмотра очереди()
Операция peek() используется для извлечения элемента из головы очереди без его удаления. Если он успешно выполняет операцию проверки, он возвращает головной элемент очереди. В противном случае он возвращает нулевое значение.
Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.
Вывод:- Когда мы запустим вышеуказанную программу, мы получим следующий вывод:
Если мы попытаемся вызвать метод peek() в пустой очереди, он вернет нулевое значение, но НЕ вызовет исключение, как показано выше.
Категории очередей Java
В Java мы можем найти множество реализаций очередей. W может в широком смысле разделить их на следующие два типа
Ограниченные очереди-это очереди, которые ограничены емкостью, что означает, что нам нужно указать максимальный размер очереди на момент создания. Например, ArrayBlockingQueue (см. Предыдущий пример).
Неограниченные очереди-это очереди, которые НЕ ограничены емкостью, что означает, что мы не должны указывать размер очереди. Например, Связанный список (см. Предыдущий пример).
Все очереди, доступные в пакете java.util, являются Неограниченными Очередями, а очереди, доступные в пакете java.util.concurrent, являются ограниченными очередями.
Другими словами, W может в широком смысле разделить их на следующие два типа:
Все очереди, реализующие интерфейс BlockingQueue, являются Блокирующими Очередями, а остальные-Неблокирующими Очередями.
Блокирующие очереди блокируются до тех пор, пока не завершится выполнение задания или время ожидания, но Неблокирующие очереди этого не делают.
Некоторые очереди являются очередями Deques, а некоторые очереди являются очередями с приоритетом.
Операции блокировки очереди
В дополнение к двум формам операций очереди, Блокирующая очередь поддерживает еще две формы, как показано ниже.
| поставить(e) | Вставить | предложение(e, время, единица измерения) | предложение(e) | добавить(e) |
| возьмите() | Удалять | опрос(время, единица измерения) | опрос() | удалить() |
| Н/Д | Исследовать | Н/Д | заглянуть() | элемент() |
Некоторые операции блокируются до тех пор, пока он не завершит свою работу, а другие блокируются до истечения времени ожидания.
Это все краткое описание очереди на Java. Я надеюсь, что эти примеры очередей Java помогут вам начать работу с программированием сбора очередей.
Пожалуйста, напишите мне комментарий, если вам нравятся мои учебные пособия или у вас есть какие-либо предложения, проблемы или ошибки ввода.
Справочник по Java Collections Framework
Данная публикация не является полным разбором или анализом (не покрывает пакет java.util.concurrent ). Это, скорее, справочник, который поможет начинающим разработчикам понять ключевые отличия одних коллекций от других, а более опытным разработчикам просто освежить материал в памяти.
Что такое Java Collections Framework?
Java Collection Framework — иерархия интерфейсов и их реализаций, которая является частью JDK и позволяет разработчику пользоваться большим количесвом структур данных из «коробки».
Базовые понятия
Интерфейс Map [doc]
Hashtable — реализация такой структуры данных, как хэш-таблица. Она не позволяет использовать null в качестве значения или ключа. Эта коллекция была реализована раньше, чем Java Collection Framework, но в последствии была включена в его состав. Как и другие коллекции из Java 1.0, Hashtable является синхронизированной (почти все методы помечены как synchronized ). Из-за этой особенности у неё имеются существенные проблемы с производительностью и, начиная с Java 1.2, в большинстве случаев рекомендуется использовать другие реализации интерфейса Map ввиду отсутствия у них синхронизации.
WeakHashMap — реализация хэш-таблицы, которая организована с использованием weak references. Другими словами, Garbage Collector автоматически удалит элемент из коллекции при следующей сборке мусора, если на ключ этого элеметна нет жёстких ссылок.
Интерфейс List [doc]
Реализации этого интерфейса представляют собой упорядоченные коллекции. Кроме того, разработчику предоставляется возможность доступа к элементам коллекции по индексу и по значению (так как реализации позволяют хранить дубликаты, результатом поиска по значению будет первое найденное вхождение).
ArrayList — как и Vector является реализацией динамического массива объектов. Позволяет хранить любые данные, включая null в качестве элемента. Как можно догадаться из названия, его реализация основана на обычном массиве. Данную реализацию следует применять, если в процессе работы с коллекцией предплагается частое обращение к элементам по индексу. Из-за особенностей реализации поиндексное обращение к элементам выполняется за константное время O(1). Но данную коллекцию рекомендуется избегать, если требуется частое удаление/добавление элементов в середину коллекции. Подробный анализ и описание можно почитать в этом хабратопике.
Интерфейс Set [doc]
Представляет собой неупорядоченную коллекцию, которая не может содержать дублирующиеся данные. Является программной моделью математического понятия «множество».
Интерфейс Queue [doc]
Этот интерфейс описывает коллекции с предопределённым способом вставки и извлечения элементов, а именно — очереди FIFO (first-in-first-out). Помимо методов, определённых в интерфейсе Collection, определяет дополнительные методы для извлечения и добавления элементов в очередь. Большинство реализаций данного интерфейса находится в пакете java.util.concurrent и подробно рассматриваются в данном обзоре.
Заключение
Java Collections Framework содержит большое количество различных структур данных, доступных в JDK «из коробки», которые в большинстве случаев покрывают все потребности при реализации логики приложения. Сравнение временных характеристик основных коллекций, которые зачастую используются в разработке приложений приведено в таблице:
При необходимости, разработчик может создать собственную реализацию, расширив или переопределив существующую логику, либо создав свою собственную реализацию подходящего интерфейса с нуля. Также существует некоторое количество готовых решений, которые являются альтернативой или дополнением к Java Collections Framework. Наиболее популярными являются Google Guava и Commons Collections.
Пишем очередь на Java
Очередь на Java. Теория
Структура данных, которая называется в информатике очередь, несколько напоминает стек, но в очереди первым изымается элемент, вставленный первым. (Способ организации данных FIFO, First-In-First-Out), в то время как в стеке мы видели, что первым изымался тот элемент, который вставлялся последним (способ организации данных LIFO, Last-In-First-Out).
Очередь работает по тому же принципу как и любая очередь в кино (человек, который первым встал в очередь, первым дойдет до кассы и купит билет). Соответственно тот кто станет в очередь последним, купит билет последним (или не купит его вообще, если все билеты будут распроданы).
Очередь — такой же вспомогательный инструмент программиста, как и стек. Они используются для моделирования реальных ситуаций ожидания клиентов в банке, вылета самолетов или передачи данных по Интернету.
Где используется очередь?
В операционной системе Вашего компьютера (и в сети интернет) постоянно работают различные очереди, незаметно исполняющие свои обязанности.
Например, в очереди печати — документы ждут освобождения принтера. Данные вводимые с клавиатуры, также хранятся в очереди.
Если вы работаете в текстовом редакторе, а компьютер отвлекается на выполнение другой операции, то нажатые будут ждать в очереди, пока у редактора не явится свободное время для их получения.
Реализация очереди
Проиллюстрируем нашу очередь. Первый элемент в очереди назовем Front, элемент который находит в очереди последним — Rear. Основой нашей очереди будет классический массив.
Две основные операции с очередью, это: вставка элемента в конец очереди и удаления элемента из начала очереди.
Графическая иллюстрация вставки элемента (вставляем число 7):
Удалим элемент из начала очереди (321):
Стоит рассмотреть такое явление, как циклический перенос. При вставки нового элемента, маркер Front смещается вверх в сторону более высоких индексов. При удалении элементов, маркер Rear также смещается вверх. Проблема в том, что даже если в начале массива будут пустые ячейки, из которых были удалены элементы, вставить новый элемент не получится, потому что маркера Rear некуда двигаться дальше. Проиллюстрируем эту ситуацию:
Для решения этой проблемы со вставкой в очередь в которой имеются свободные ячейки, маркеры Front и Rear при достижении границы массива перемещаются до его начала. Такая структура данных называется циклической очередь (или кольцевым буфером).
Пример очереди (Queue) на Java
Реализуем очередь на базе массива. Объявим и инициализирует переменные:








