Найти в Дзене
Java Джун

Что такое очередь (Queue) в Java

Оглавление

Очередь (Queue) - это очень интересный тип хранения данных. Мы можем проводить с ней ограниченное количество операций - обычно только с верхним элементом, и не имеем доступа к "середине" очереди.

Выглядит странно? На самом деле, есть много примеров из повседневной жизни, которые помогут нам представить механизм работы очереди.

  • В идеале, мы не можем встать в середину очереди - только в конец.
  • Тем не менее, убирать элемент можно и из середины очереди - так, например, человек в любой момент может махнуть рукой и сказать: "А, я уже три часа тут стою - пойду домой!"
  • Более того, элемент не всегда может влезть в очередь (в смысле в Queue). Например, не сталкивались с  тем, что доходит очередь до Вас - и как раз начинается обед?

FIFO и LIFO в Java

Кстати, "принцип очереди" - то, что первый, кто пришел, первым получает мороженое - обозначается английской аббревиатурой FIFO ("First in first out"). Переводится как "первый пришел первый вышел". Кроме очереди можно привести пример с конвейером - то, что ты положил раньше на конвейерную ленту, первым станет готовым продуктом и поедет в магазин.

Также в Java есть структуры, которые работают чуть-чуть по-другому. В таких структурах тот элемент, который поступил первым, первым вынимается. Можно провести аналогию со стопкой тарелок - та тарелка, которую ты поставил первой, оказывается в самом низу. Очень неудобно доставать, правда?

-2

Поэтому мы моем тарелки, начиная с самой верхней - т.е. той, которую мы поставили последней. Этот принцип называется LIFO ("Last in first out", "последний пришел первый вышел"). По такому принципу работает еще одна структура данных, очень похожая на очередь - стек. Но это уже совсем другая история.

Операции с Queue

1. add() - добавляет элемент в конец очереди.

  • Поправка: если очередь с приоритетом - т.е. PriorityQueue - элемент ставится не обязательно в конец, а в соответствии со своим приоритетом.

2. remove() и poll() - удаляет верхний элемент из очереди.

3. offer() - пытается вставить элемент в конец очереди.

4. peek() и element() - показывают верхний элемент очереди

Пример

  • add() - добавляем элемент в конец очереди. (Поправка: если очередь с приоритетом - т.е. PriorityQueue - элемент ставится не обязательно в конец, а в соответствии со своим приоритетом):
-3

Тут мы добавили три Integer-а: 1, 2 и 3. Потом мы вывели нашу очередь в консоль - получили:

-4