Что такое Queue в Java и основные реализации?

Ответ

Queue (очередь) — это интерфейс из Java Collections Framework, представляющий коллекцию, предназначенную для хранения элементов перед обработкой в определенном порядке. Обычно это порядок FIFO (First-In-First-Out), но возможны и другие (например, по приоритету).

Основные методы:

  • add(e), offer(e) — вставка элемента.
  • remove(), poll() — извлечение и удаление головного элемента.
  • element(), peek() — получение головного элемента без удаления.

Важные реализации:

Реализация Описание Особенности
LinkedList Реализует и List, и Queue. Двусторонняя очередь, не потокобезопасна.
PriorityQueue Очередь с приоритетом. Элементы извлекаются в порядке, заданном Comparator или естественным порядком.
ArrayDeque Двусторонняя очередь на основе массива. Более эффективна, чем LinkedList, для использования в качестве стека или очереди.
BlockingQueue (интерфейс) Очередь с поддержкой блокирующих операций. Используется в многопоточных сценариях. Реализации: ArrayBlockingQueue, LinkedBlockingQueue.

Пример использования:

Queue<String> queue = new LinkedList<>();
queue.offer("First");
queue.offer("Second");

System.out.println(queue.poll()); // "First"
System.out.println(queue.peek()); // "Second"

Ответ 18+ 🔞

А, вот эта штука, Queue, да? Очередь, блядь. Ну, представь себе, реальную очередь, в магазине, например. Первый пришёл — первый ушёл, логично же? Это и есть FIFO, ёпта. Первый зашёл — первый вышел. Как в хорошем борделе, только без скидок.

Вот этот интерфейс — он как раз про то, чтобы элементы в определённом порядке складировать, а потом по этому же порядку их и выгребать на обработку. Хотя, бывают и извращенцы, которые PriorityQueue используют — там уже не FIFO, а кто важнее, тот и вперёд. Как в поликлинике для блатных.

Основные приёмы, так сказать:

  • add(e), offer(e) — воткнуть элемент в хвост. add может взбеситься, если места нет, а offer — более воспитанный, просто скажет «false», мол, не вышло, извини.
  • remove(), poll() — выдернуть элемент с самого начала очереди. remove орет, если очередь пустая, а poll — тихоня, вернёт null и не пикнет.
  • element(), peek() — подглядеть, кто там в начале стоит, но не вытаскивать. element — истеричка, peek — спокойный тип.

А теперь, сука, смотри, какие бывают разновидности этой очерединой хуйни:

Что за зверь Суть Особые приметы
LinkedList Да это же наша старая знакомая, двухсвязная списка! Она и в очередь умеет, и в список. Туда-сюда ходить можно, но в потоках с ней лучше не шутить — не потокобезопасная тварь.
PriorityQueue Очередь для выскочек. Кто по приоритету круче — тот и лезет вперёд. Задаёшь Comparator или полагаешься на естественный порядок, а она уже сама решает, кто важнее. Хитрая жопа.
ArrayDeque Очередь на массиве, двусторонняя. Обычно шустрее и экономичнее, чем LinkedList. Для стека или обычной очереди — самое то.
BlockingQueue (интерфейс) А это уже серьёзная банда для многопоточности. Тут операции могут блокировать поток: ждать, пока место появится, или элемент подбросят. Реализации: ArrayBlockingQueue, LinkedBlockingQueue. Настоящие тяжеловесы.

Ну и куда же без примерчика, чтобы совсем понятно стало:

Queue<String> queue = new LinkedList<>(); // Берём простую очередь на списке
queue.offer("Первый"); // Становись в конец, блядь!
queue.offer("Второй");

System.out.println(queue.poll()); // Выведет "Первый" — он первый и свалил
System.out.println(queue.peek()); // Выведет "Второй" — он теперь голова, но пока ещё в строю стоит

Вот и вся магия. Ничего сложного, обычная житейская очередь, только в коде. Главное — не пытайся poll() из пустой очереди без проверки, а то получишь null и будешь потом ебаться с NullPointerException, как дурак.