Поиск по сайту:

Java Queue — очередь в Java


Java-очередь

В этом разделе мы обсудим некоторые важные моменты, связанные с Java Queue:

  • Интерфейс java.util.Queue является подтипом интерфейса java.util.Collection.
  • Подобно реальной очереди (например, в банке или банкомате), очередь вставляет элементы в конец очереди и удаляет из начала очереди.
  • Java Queue представляет собой упорядоченный список элементов.
  • Java Queue следует порядку FIFO для вставки и удаления своих элементов. FIFO расшифровывается как First In First Out.
  • Java Queue поддерживает все методы интерфейса Collection.
  • Наиболее часто используемыми реализациями Queue являются LinkedList, ArrayBlockingQueue и PriorityQueue.
  • BlockingQueues не принимает пустые элементы. Если мы выполняем любую операцию, связанную с нулевым значением, возникает исключение NullPointerException.
  • Очереди BlockingQueue используются для реализации приложений на основе источника/потребителя.
  • BlockingQueues являются потокобезопасными.
  • Все очереди, доступные в пакете java.util, являются неограниченными очередями, а очереди, доступные в пакете java.util.concurrent, являются ограниченными очередями.
  • Все Deques не являются потокобезопасными.
  • ConcurrentLinkedQueue — это неограниченная потокобезопасная очередь, основанная на связанных узлах.
  • Все очереди поддерживают вставку в конец очереди и удаление в начало очереди, за исключением Deques.
  • Очереди — это очереди, но они поддерживают вставку и удаление элементов на обоих концах.

Диаграмма класса очереди Java

Методы очереди Java

В этом разделе мы обсудим некоторые полезные и часто используемые методы Java Queue:

  1. int size(): чтобы получить количество элементов в наборе.
  2. boolean isEmpty(): чтобы проверить, является ли Set пустым или нет.
  3. boolean contains(Object o): возвращает true, если этот набор содержит указанный элемент.
  4. Итератор iterator(): возвращает итератор для элементов в этом наборе. Элементы возвращаются в произвольном порядке.
  5. boolean removeAll(Collection c): удаляет из этого набора все его элементы, содержащиеся в указанной коллекции (дополнительная операция).
  6. boolean continueAll(Collection c): сохраняет в этом наборе только те элементы, которые содержатся в указанной коллекции (дополнительная операция).
  7. void clear(): удаляет все элементы из набора.
  8. E remove(): получает и удаляет заголовок этой очереди.
  9. E poll(): извлекает и удаляет заголовок этой очереди или возвращает значение null, если эта очередь пуста.
  10. E peek(): извлекает, но не удаляет заголовок этой очереди, или возвращает значение null, если эта очередь пуста.
  11. boolean offer(E e): вставляет указанный элемент в эту очередь, если это возможно сделать немедленно, не нарушая ограничения емкости.
  12. E element(): извлекает, но не удаляет заголовок этой очереди.
  13. boolean add(E e): вставляет указанный элемент в эту очередь, если это возможно сделать немедленно, не нарушая ограничений емкости, возвращает true в случае успеха и выдает исключение IllegalStateException, если в данный момент нет свободного места.
  14. Object[] toArray(): возвращает массив, содержащий все элементы этого набора. Если этот набор дает какие-либо гарантии относительно того, в каком порядке его элементы возвращаются его итератором, этот метод должен возвращать элементы в том же порядке.

Основы очереди Java

Поскольку Java Queue расширяет коллекцию Java, она также поддерживает все операции интерфейса коллекции. Давайте рассмотрим некоторые простые операции на следующем примере:

package com.journaldev.queue;
import java.util.*;

public class QueueExample {
   public static void main(String[] args) {
		
	Queue<String> queue = new LinkedList<>();
	queue.add("one");
	queue.add("two");
	queue.add("three");
	queue.add("four");
	System.out.println(queue);
		
	queue.remove("three");
	System.out.println(queue);
	System.out.println("Queue Size: " + queue.size());
	System.out.println("Queue Contains element 'two' or not? : " + queue.contains("two"));

	// To empty the queue
	queue.clear();
   }
}

Выход:-

[one, two, three, four]
[one, two, four]
Queue Size: 3
Queue Contains element 'two' or not? : true

Массив Java в очередь

Здесь мы можем изучить, как преобразовать массив Java в Queue с помощью метода «Collections.addAll()» на одном простом примере.

import java.util.*;

public class ArrayToQueue {
    public static void main(String[] args) {
		
	String nums[] = {"one","two","three","four","five"};
	Queue<String> queue = new LinkedList<>();
	Collections.addAll(queue, nums);
	System.out.println(queue);
   }
}

Вывод: - Когда мы запустим вышеуказанную программу, мы получим следующий вывод:

[one, two, three, four, five]

Очередь Java в массив

Здесь мы рассмотрим, как преобразовать очередь Java в массив Java с помощью \toArray() на одном простом примере.

import java.util.*;

public class QueueToArray {
   public static void main(String[] args) {
		
	Queue<String> queue = new LinkedList<>();
	queue.add("one");
	queue.add("two");
	queue.add("three");
	queue.add("four");
	queue.add("five");
		
	String strArray[] = queue.toArray(new String[queue.size()]);
	System.out.println(Arrays.toString(strArray)); 

   }
}

Вывод: - Когда мы запустим вышеуказанную программу, мы получим следующий вывод:

[one, two, three, four, five]

Общие операции с очередью Java

Java Queue поддерживает все операции, поддерживаемые интерфейсом Collection, и некоторые другие операции. Он поддерживает почти все операции в двух формах.

  • Один набор операций вызывает исключение, если операция завершается неудачно.
  • Другой набор операций возвращает специальное значение в случае сбоя операции.

В следующей таблице кратко поясняются все общие операции очереди.

Operation Throws exception Special value
Insert add(e) offer(e)
Remove remove() poll()
Examine element() peek()

Мы рассмотрим каждую операцию и подробно обсудим их с некоторыми полезными примерами в следующих разделах.

Операции вставки очереди Java

В этом разделе мы подробно обсудим операцию вставки в очередь Java с некоторыми полезными примерами. Если эта операция выполняется успешно, она возвращает значение «true». Как известно, Queue поддерживает операцию вставки в двух формах:

  • Queue.add(e): Выдает исключение, если операция не удалась. - Queue.offer(e): Он возвращает специальное значение, если операция не удалась.

ПРИМЕЧАНИЕ. Здесь специальное значение может быть либо «ложным», либо «нулевым».

Операция добавления в очередь()

Операция add() используется для вставки нового элемента в очередь. Если он выполняет операцию вставки успешно, он возвращает значение «истина». В противном случае он генерирует исключение java.lang.IllegalStateException. Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.

import java.util.concurrent.*;

public class QueueAddOperation {
   public static void main(String[] args) {
		
	BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);

	System.out.println(queue.add("one"));
	System.out.println(queue.add("two"));
	System.out.println(queue);
	System.out.println(queue.add("three"));
	System.out.println(queue);
   }
}

Вывод: - Когда мы запустим вышеуказанную программу, мы получим следующий вывод:

true
true
[one, two]
Exception in thread "main" java.lang.IllegalStateException: Queue full

Поскольку наша очередь ограничена двумя элементами, когда мы пытаемся добавить третий элемент с помощью BlockingQueue.add(), возникает исключение, как показано выше.

Поставить в очередь операцию offer()

Операция offer() используется для вставки нового элемента в очередь. Если он выполняет операцию вставки успешно, он возвращает значение «истина». В противном случае он возвращает значение «ложь». Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.

import java.util.concurrent.*;

public class QueueOfferOperation {
   public static void main(String[] args) {
		
	BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);

	System.out.println(queue.offer("one"));
	System.out.println(queue.offer("two"));
	System.out.println(queue);
	System.out.println(queue.offer("three"));
	System.out.println(queue);
   }
}

Вывод: - Когда мы запустим вышеуказанную программу, мы получим следующий вывод:

true
true
[one, two]
false
[one, two]

Поскольку наша очередь ограничена двумя элементами, когда мы пытаемся добавить третий элемент с помощью операции BlockingQueue.offer(), она возвращает значение «false», как показано выше.

Операции удаления очереди Java

В этом разделе мы подробно обсудим операцию удаления очереди Java с некоторыми полезными примерами. Операции удаления возвращают головной элемент очереди, если он выполняется успешно. Как мы знаем, Queue поддерживает операцию удаления в двух формах:

  • Очередь.удалить(): Выдает исключение, если операция не удалась. Queue.poll(): Он возвращает специальное значение, если операция не удалась.

ПРИМЕЧАНИЕ. Здесь специальное значение может быть либо «ложным», либо «нулевым».

Операция удаления очереди()

Операция remove() используется для удаления элемента из головы очереди. Если он успешно выполняет операцию удаления, он возвращает головной элемент очереди. В противном случае выдается исключение java.util.NoSuchElementException. Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.

import java.util.*;

public class QueueRemoveOperation 
{
   public static void main(String[] args) 
   {		
	Queue<String> queue = new LinkedList<>();
	queue.offer("one");
	queue.offer("two");		
	System.out.println(queue);		
	System.out.println(queue.remove());
	System.out.println(queue.remove());		
	System.out.println(queue.remove());		
   }
}

Вывод: - Когда мы запустим вышеуказанную программу, мы получим следующий вывод:

[one, two]
one
two
Exception in thread "main" java.util.NoSuchElementException

Поскольку в нашей очереди всего два элемента, когда мы пытаемся вызвать метод remove() в третий раз, он выдает исключение, как показано выше. ПРИМЕЧАНИЕ. — Queue.remove(element) используется для удаления указанного элемента из очереди. Если он выполняет операцию удаления успешно, он возвращает значение «истина». В противном случае он возвращает значение «ложь».

Операция опроса очереди()

Операция poll() используется для удаления элемента из головы очереди. Если он успешно выполняет операцию удаления, он возвращает головной элемент очереди. В противном случае он возвращает значение «null». Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.

import java.util.*;

public class QueuePollOperation 
{
   public static void main(String[] args) 
   {		
	Queue<String> queue = new LinkedList<>();
	queue.offer("one");
	queue.offer("two");		
	System.out.println(queue);		
	System.out.println(queue.poll());
	System.out.println(queue.poll());		
	System.out.println(queue.poll());		
   }
}

Вывод: - Когда мы запустим вышеуказанную программу, мы получим следующий вывод:

[one, two]
one
two
null

Поскольку в нашей очереди всего два элемента, когда мы пытаемся вызвать метод poll() в третий раз, он возвращает нулевое значение, как показано выше.

Операции проверки очереди Java

В этом разделе мы подробно обсудим операции Java Queue Examine с некоторыми полезными примерами. Если эта операция выполняется успешно, она возвращает головной элемент очереди, не удаляя его. Как мы знаем, Queue поддерживает операцию проверки в двух формах:

  • Очередь.элемент(): Выдает исключение, если операция не удалась. Queue.peek(): Он возвращает специальное значение, если операция не удалась.

ПРИМЕЧАНИЕ. Здесь специальное значение может быть либо «ложным», либо «нулевым».

Операция элемента очереди()

Операция element() используется для извлечения элемента из головы очереди без его удаления. Если он успешно выполняет операцию проверки, он возвращает головной элемент очереди. В противном случае выдается исключение java.util.NoSuchElementException. Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.

import java.util.*;

public class QueueElementOperation {
   public static void main(String[] args) {
		
	Queue<String> queue = new LinkedList<>();
	queue.add("one");
		
	System.out.println(queue.element());
	System.out.println(queue);
	queue.clear();
	System.out.println(queue.element());
   }
}

Вывод: - Когда мы запустим вышеуказанную программу, мы получим следующий вывод:

one
[one]
Exception in thread "main" java.util.NoSuchElementException

Если мы попытаемся вызвать метод element() для пустой очереди, он выдаст исключение, как показано выше.

Операция просмотра очереди()

Операция peek() используется для извлечения элемента из головы очереди без его удаления. Если он успешно выполняет операцию проверки, он возвращает головной элемент очереди. В противном случае он возвращает нулевое значение. Давайте разработаем один простой пример, чтобы продемонстрировать эту функциональность.

import java.util.*;

public class QueuePeekOperation {
   public static void main(String[] args) {
		
	Queue<String> queue = new LinkedList<>();
	queue.add("one");
		
	System.out.println(queue.peek());
	System.out.println(queue);
	queue.clear();
	System.out.println(queue.peek());
   }
}

Вывод: - Когда мы запустим вышеуказанную программу, мы получим следующий вывод:

one
[one]
null

Если мы попытаемся вызвать метод peek() для пустой очереди, он вернет нулевое значение, но НЕ выдаст исключение, как показано выше.

Категории очередей Java

В Java мы можем найти множество реализаций Queue. W может разделить их на следующие два типа

  • Ограниченные очереди
  • Неограниченные очереди

Ограниченные очереди — это очереди, которые ограничены емкостью, что означает, что нам необходимо указать максимальный размер очереди во время создания. Например, ArrayBlockingQueue (см. предыдущий пример). Неограниченные очереди — это очереди, которые НЕ ограничены емкостью, что означает, что мы не должны указывать размер очереди. Например, LinkedList (см. предыдущий пример). Все очереди, доступные в пакете java.util, являются неограниченными очередями, а очереди, доступные в пакете java.util.concurrent, являются ограниченными очередями. Другими словами, W может разделить их на следующие два типа:

  • Блокировка очередей
  • Неблокирующие очереди

Все очереди, реализующие интерфейс BlockingQueue, являются BlockingQueue, а остальные — неблокирующими очередями. BlockingQueues блокирует до тех пор, пока не завершит свою работу или не истечет время, а Non-BlockingQueues — нет. Некоторые очереди являются Deques, а некоторые очереди PriorityQueue.

Блокировка операций с очередью

В дополнение к двум формам операций Queue, BlockingQueue поддерживает еще две формы, как показано ниже.

Operation Throws exception Special value Blocks Times out
Insert add(e) offer(e) put(e) offer(e, time, unit)
Remove remove() poll() take() poll(time, unit)
Examine element() peek() N/A N/A

Некоторые операции блокируются до завершения своей работы, а другие блокируются до истечения времени ожидания. Это все краткий обзор Queue в Java. Я надеюсь, что эти примеры Java Queue помогут вам приступить к программированию коллекций Queue. Пожалуйста, напишите мне комментарий, если вам нравятся мои уроки или у вас есть какие-либо предложения, проблемы или ошибки ввода. Спасибо.