Интерфейс Queue в Java

Благодаря классам реализующим Queue можно создавать массивы реализующие очередь.

Example

Что такое очередь?

Очередь работает по принципу FIFO – first in first out (первый пришел – первым ушел). Представьте массив в который элементы можно добавлять только по очереди в конец, то есть после самого последнего элемента массива который был туда добавлен, а удалять элементы можно только по очереди начиная с самого первого элемента массива который мы туда добавили. То есть как видим первый вошедший в массив будет удален оттуда первым. Это и есть очередь.

Правда мы уже рассматривали LinkedList, который тоже реализует очередь (FIFO).

Помним, что если у LinkedList вызвать метод add, то элемент добавиться в конец LinkedList, если же вызвать просто remove без аргументов, то удалиться элемент, который был добавлен в очередь наиболее давно.

То есть, очевидно, что это реализация очереди.

У ArrayList, например, нельзя вызвать remove без аргументов, поэтому ArrayList не является реализацией очереди.

У Queue же есть более интересные реализации очереди, например, приоритетная очередьPriorityQueue.

При добавлении элемента в конец массива элементы в нем еще и сортируются по приоритету.

Приоритет задан по умолчанию у некоторых типов.

То есть если, например, массив PriorityQueue хранит Integer числа, то при добавлении числа в него будет происходить сортировка массива так, чтобы все элементы массива располагались в массиве от большего числа к меньшему.

При выборке же элемента из приоритетной очереди, будет происходить выборка элементов с того конца массива, где наименьшее число.


PriorityQueue

Пример программы:

import java.util.*; public class Queue { public static void main(String[] args) { // Создаем приоритетную очередь, в которой // будут храниться числа типа Integer PriorityQueue< Integer > pQueue = new PriorityQueue< Integer >(); // добавление элемента pQueue.add(4); pQueue.add(3); pQueue.add(7); pQueue.add(1); pQueue.add(8); // В PriorityQueue нет метода get, поэтому сначала нужно // преобразовать в массив, а потом извлекать, // либо использовать итератор, который рассмотрим далее Integer[] hSetArr = pQueue.toArray(new Integer[pQueue.size()]); for (int i = 0; i < hSetArr.length; i++) { System.out.println(hSetArr[i]); } // Проверка на наличие элемента в списке System.out.println(pQueue.contains(3)); // Можно увидеть приоритет удаления (от меньшего числа к большему) System.out.println(pQueue.remove()); System.out.println(pQueue.remove()); System.out.println(pQueue.remove()); System.out.println(pQueue.remove()); System.out.println(pQueue.remove()); // Как можно увидеть по результатам, // удаляется от меньшего числа к большему. } }

Вывод:

Как можно увидеть по результатам, удаление происходит от меньшего числа к большему.

Интерфейс Map в Java

Разберитесь с HashMap, TreeMap и LinkedHashMap: хранение пар ключ-значение, сортировка по ключу и принцип работы hash-коллекций. Практические примеры.

Time to read: 16

Интерфейс Set в Java

Изучите HashSet, TreeSet и LinkedHashSet в Java: как хранить только уникальные элементы, сортировать их и сохранять порядок вставки. Примеры кода.

Time to read: 9

Потоки ввода/вывода. PrintWriter и PrintStream

Разбираем PrintWriter и PrintStream в Java: в чем разница, когда использовать. Примеры вывода данных в консоль с помощью этих потоков.

Time to read: 10