Java-Warteschlange ist eine Schnittstelle, die im java.util-Paket verfügbar ist und die java.util.Collection-Schnittstelle erweitert. Genauso wie Java-Liste ist Java-Warteschlange eine Sammlung geordneter Elemente (oder Objekte), führt jedoch Einfüge- und Entfernungsoperationen unterschiedlich aus. Wir können die Warteschlange verwenden, um Elemente zu speichern, bevor wir sie verarbeiten.
Java-Warteschlange
In diesem Abschnitt werden einige wichtige Punkte zur Java-Warteschlange diskutiert:
- Die java.util.Queue-Schnittstelle ist ein Untertyp der java.util.Collection-Schnittstelle.
- Genau wie in einer realen Warteschlange (zum Beispiel in einer Bank oder an einem Geldautomaten) fügt die Warteschlange Elemente am Ende der Warteschlange ein und entfernt sie am Anfang der Warteschlange.
- Java-Warteschlange stellt eine geordnete Liste von Elementen dar.
- Java-Warteschlange folgt der FIFO-Reihenfolge zum Einfügen und Entfernen seiner Elemente. FIFO steht für First In First Out.
- Java-Warteschlange unterstützt alle Methoden der Collection-Schnittstelle.
- Die am häufigsten verwendeten Implementierungen von Warteschlangen sind LinkedList, ArrayBlockingQueue und PriorityQueue.
- BlockingQueues akzeptieren keine Null-Elemente. Wenn wir eine nullbezogene Operation ausführen, wird eine NullPointerException ausgelöst.
- BlockingQueues werden verwendet, um Anwendungen basierend auf Produzenten/Verbraucher zu implementieren.
- BlockingQueues sind threadsicher.
- Alle Warteschlangen, die im java.util-Paket verfügbar sind, sind ungebundene Warteschlangen, und die Warteschlangen, die im java.util.concurrent-Paket verfügbar sind, sind begrenzte Warteschlangen.
- Alle Deques sind nicht thread-sicher.
- ConcurrentLinkedQueue ist eine ungebundene, thread-sichere Warteschlange auf der Grundlage von verketteten Knoten.
- Alle Warteschlangen unterstützen das Einfügen am Ende der Warteschlange und das Entfernen am Anfang der Warteschlange, außer Deques.
- Deques sind Warteschlangen, unterstützen jedoch das Einfügen und Entfernen von Elementen an beiden Enden.
Java Queue Klassendiagramm
Die Java Queue-Schnittstelle erweitert die Collection-Schnittstelle. Die Collection-Schnittstelle erweitert die Iterable-Schnittstelle. Einige der häufig verwendeten Implementierungsklassen für Warteschlangen sind LinkedList, PriorityQueue, ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue usw. AbstractQueue bietet eine Skelettimplementierung der Queue-Schnittstelle, um den Aufwand bei der Implementierung der Queue zu reduzieren.
Java Queue-Methoden
In diesem Abschnitt werden einige der nützlichen und häufig verwendeten Java Queue-Methoden besprochen:
- int size(): um die Anzahl der Elemente im Set zu erhalten.
- boolean isEmpty(): Überprüft, ob das Set leer ist oder nicht.
- boolean contains(Object o): Gibt true zurück, wenn dieses Set das angegebene Element enthält.
- Iterator iterator(): Gibt einen Iterator über die Elemente in diesem Set zurück. Die Elemente werden in keiner bestimmten Reihenfolge zurückgegeben.
- boolean removeAll(Collection c): Entfernt aus diesem Set alle Elemente, die in der angegebenen Sammlung enthalten sind (optionale Operation).
- boolean retainAll(Collection c): Behält nur die Elemente in diesem Set bei, die in der angegebenen Sammlung enthalten sind (optionale Operation).
- void clear(): Entfernt alle Elemente aus dem Set.
- E remove(): Retrieves and removes the head of this queue.
- E poll(): Retrieves and removes the head of this queue, or returns null if this queue is empty.
- E peek(): Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.
- boolean offer(E e): Fügt das angegebene Element in diese Warteschlange ein, wenn dies sofort möglich ist, ohne Kapazitätsbeschränkungen zu verletzen.
- E element(): Retrieves, but does not remove, the head of this queue.
- boolean add(E e): Fügt das angegebene Element in diese Warteschlange ein, wenn dies sofort möglich ist, ohne Kapazitätsbeschränkungen zu verletzen. Gibt true bei Erfolg zurück und wirft eine IllegalStateException, wenn derzeit kein Platz verfügbar ist.
- Object[] toArray(): Gibt ein Array zurück, das alle Elemente in diesem Set enthält. Wenn dieses Set Garantien darüber macht, in welcher Reihenfolge seine Elemente durch seinen Iterator zurückgegeben werden, muss diese Methode die Elemente in derselben Reihenfolge zurückgeben.
Java Queue Basics
Da Java Queue Java Collection erweitert, unterstützt es auch alle Operationen der Collection-Schnittstelle. Lassen Sie uns einige einfache Operationen im folgenden Beispiel erkunden:
package com.journaldev.queue;
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
Queue 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"));
// Um die Warteschlange zu leeren
queue.clear();
}
}
Ausgabe:-
[one, two, three, four]
[one, two, four]
Queue Size: 3
Queue Contains element 'two' or not? : true
Java-Array zu Warteschlange
Hier können wir erkunden, wie man ein Java-Array in eine Warteschlange mit der Methode „Collections.addAll()“ konvertiert, anhand eines einfachen Beispiels.
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);
}
}
Ausgabe:- Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe:
[one, two, three, four, five]
Java-Warteschlange zu Array
Hier werden wir erkunden, wie man eine Java-Warteschlange mit einem einfachen Beispiel in ein Java-Array konvertiert, indem man „toArray()“ verwendet.
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));
}
}
Ausgabe:- Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe:
[one, two, three, four, five]
Gemeinsame Operationen der Java-Warteschlange
Java Queue unterstützt alle Operationen, die von der Collection-Schnittstelle unterstützt werden, und einige weitere Operationen. Es unterstützt fast alle Operationen in zwei Formen.
- Ein Satz von Operationen wirft eine Ausnahme, wenn die Operation fehlschlägt.
- Die andere Gruppe von Operationen gibt einen speziellen Wert zurück, wenn die Operation fehlschlägt.
Die folgende Tabelle erläutert alle gemeinsamen Operationen der Warteschlange kurz.
Operation | Throws exception | Special value |
---|---|---|
Insert | add(e) | offer(e) |
Remove | remove() | poll() |
Examine | element() | peek() |
Wir werden jede Operation aufgreifen und sie in den kommenden Abschnitten ausführlich besprechen.
Java Queue Insert Operations
In diesem Abschnitt werden wir die Java Queue Insert Operation im Detail besprechen und einige nützliche Beispiele geben. Wenn diese Operation erfolgreich durchgeführt wird, gibt sie den Wert „true“ zurück. Wie wir wissen, unterstützt die Queue die Einfügeoperation in zwei Formen:
- Queue.add(e):
Es wirft eine Ausnahme, wenn die Operation fehlschlägt.- Queue.offer(e):
Es gibt einen speziellen Wert zurück, wenn die Operation fehlschlägt.
HINWEIS:- Hier kann der spezielle Wert entweder „false“ oder „null“ sein.
Queue add() Operation
Die add() Operation wird verwendet, um ein neues Element in die Warteschlange einzufügen. Wenn die Einfügeoperation erfolgreich durchgeführt wird, gibt sie den Wert „true“ zurück. Andernfalls wirft sie java.lang.IllegalStateException. Lassen Sie uns ein einfaches Beispiel entwickeln, um diese Funktionalität zu demonstrieren.
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);
}
}
Ausgabe:- Wenn wir das obige Programm ausführen, erhalten wir folgende Ausgabe:
true
true
[one, two]
Exception in thread "main" java.lang.IllegalStateException: Queue full
Da unsere Warteschlange auf zwei Elemente begrenzt ist, wirft es eine Ausnahme, wenn wir versuchen, ein drittes Element mit BlockingQueue.add() hinzuzufügen, wie oben gezeigt.
Queue offer() Operation
Die offer() Operation wird verwendet, um ein neues Element in die Warteschlange einzufügen. Wenn die Einfügeoperation erfolgreich durchgeführt wird, gibt sie den Wert „true“ zurück. Andernfalls gibt sie den Wert „false“ zurück. Lassen Sie uns ein einfaches Beispiel entwickeln, um diese Funktionalität zu demonstrieren.
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);
}
}
Ausgabe:- Wenn wir das obige Programm ausführen, erhalten wir folgende Ausgabe:
true
true
[one, two]
false
[one, two]
Da unsere Warteschlange auf zwei Elemente begrenzt ist, gibt die BlockingQueue.offer() Operation bei dem Versuch, ein drittes Element hinzuzufügen, den Wert „false“ zurück, wie oben gezeigt.
Java Queue Löschoperationen
In diesem Abschnitt werden wir die Java Queue Löschoperation im Detail mit einigen nützlichen Beispielen besprechen. Die Löschoperationen geben das Kopfelement der Warteschlange zurück, wenn sie erfolgreich durchgeführt werden. Wie wir wissen, unterstützt die Warteschlange die Löschoperation in zwei Formen:
- Queue.remove():
Es wirft eine Ausnahme, wenn die Operation fehlschlägt.- Queue.poll():
Es gibt einen speziellen Wert zurück, wenn die Operation fehlschlägt.
HINWEIS:- Hier kann der spezielle Wert entweder „false“ oder „null“ sein
Queue remove() Operation
Die remove() Operation wird verwendet, um ein Element aus dem Kopf der Warteschlange zu löschen. Wenn sie die Löschoperation erfolgreich durchführt, gibt sie das Kopfelement der Warteschlange zurück. Andernfalls wirft sie java.util.NoSuchElementException. Lassen Sie uns ein einfaches Beispiel entwickeln, um diese Funktionalität zu demonstrieren.
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());
}
}
Ausgabe:- Wenn wir das obige Programm ausführen, erhalten wir folgende Ausgabe:
[one, two]
one
two
Exception in thread "main" java.util.NoSuchElementException
Da unsere Warteschlange nur zwei Elemente enthält, wenn wir versuchen, die Methode remove() zum dritten Mal aufzurufen, wird eine Ausnahme wie oben gezeigt ausgelöst. HINWEIS:- Queue.remove(element) wird verwendet, um ein angegebenes Element aus der Warteschlange zu löschen. Wenn die Löschoperation erfolgreich durchgeführt wird, gibt sie den Wert „true“ zurück. Andernfalls gibt sie den Wert „false“ zurück.
Queue poll() Operation
Die poll() Operation wird verwendet, um ein Element aus dem Kopf der Warteschlange zu löschen. Wenn die Löschoperation erfolgreich durchgeführt wird, gibt sie das Kopfelement der Warteschlange zurück. Andernfalls gibt sie den Wert „null“ zurück. Lassen Sie uns ein einfaches Beispiel entwickeln, um diese Funktionalität zu demonstrieren.
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());
}
}
Ausgabe:- Wenn wir das obige Programm ausführen, erhalten wir folgende Ausgabe:
[one, two]
one
two
null
Da unsere Warteschlange nur zwei Elemente hat, gibt die Methode poll() beim dritten Aufruf den Nullwert zurück, wie oben gezeigt.
Java Queue-Prüfoperationen
In diesem Abschnitt werden wir ausführlich über die Java Queue-Prüfoperationen mit einigen nützlichen Beispielen diskutieren. Wenn diese Operation erfolgreich ist, gibt sie das Kopfelement der Warteschlange zurück, ohne es zu entfernen. Wie wir wissen, unterstützt die Queue die Prüfoperation in zwei Formen:
- Queue.element():
Es wirft eine Ausnahme, wenn die Operation fehlschlägt.- Queue.peek():
Es gibt einen speziellen Wert zurück, wenn die Operation fehlschlägt.
HINWEIS:- Hier kann der spezielle Wert entweder „false“ oder „null“ sein.
Queue element()-Operation
Die element()-Operation wird verwendet, um ein Element vom Kopf der Warteschlange abzurufen, ohne es zu entfernen. Wenn sie die Prüfoperation erfolgreich durchführt, gibt sie das Kopfelement der Warteschlange zurück. Andernfalls wirft sie java.util.NoSuchElementException. Lassen Sie uns ein einfaches Beispiel entwickeln, um diese Funktionalität zu demonstrieren.
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());
}
}
Ausgabe:- Wenn wir das obige Programm ausführen, erhalten wir folgende Ausgabe:
one
[one]
Exception in thread "main" java.util.NoSuchElementException
Wenn wir die Methode element() auf einer leeren Warteschlange aufrufen, wird eine Ausnahme geworfen, wie oben gezeigt.
Warteschlangen peek() Operation
Die peek() Operation wird verwendet, um ein Element vom Anfang der Warteschlange abzurufen, ohne es zu entfernen. Wenn die Operation erfolgreich ist, wird das erste Element der Warteschlange zurückgegeben. Andernfalls wird ein Nullwert zurückgegeben. Lassen Sie uns ein einfaches Beispiel entwickeln, um diese Funktionalität zu demonstrieren.
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());
}
}
Ausgabe:- Wenn wir das obige Programm ausführen, erhalten wir folgende Ausgabe:
one
[one]
null
Wenn wir die Methode peek() auf einer leeren Warteschlange aufrufen, wird ein Nullwert zurückgegeben, aber es wird KEINE Ausnahme geworfen, wie oben gezeigt.
Java Warteschlangen-Kategorien
In Java gibt es viele Implementierungen von Warteschlangen. Wir können sie grob in die folgenden zwei Typen einteilen
- Begrenzte Warteschlangen
- Unbegrenzte Warteschlangen
Begrenzte Warteschlangen sind Warteschlangen, die durch ihre Kapazität begrenzt sind, das bedeutet, wir müssen die maximale Größe der Warteschlange bei der Erstellung angeben. Zum Beispiel ArrayBlockingQueue (siehe vorheriges Beispiel). Unbegrenzte Warteschlangen sind Warteschlangen, die nicht durch Kapazität begrenzt sind, das bedeutet, wir sollten die Größe der Warteschlange nicht angeben. Zum Beispiel LinkedList (siehe vorheriges Beispiel). Alle Warteschlangen, die im java.util-Paket verfügbar sind, sind unbegrenzte Warteschlangen, und Warteschlangen, die im java.util.concurrent-Paket verfügbar sind, sind begrenzte Warteschlangen. Auf andere Weise können wir sie grob in die folgenden zwei Typen einteilen:
- Blocking Queues
- Non-Blocking Queues
Alle Warteschlangen, die das BlockingQueue-Interface implementieren, sind BlockingQueues, und der Rest sind Non-Blocking Queues. BlockingQueues blockieren, bis sie ihre Arbeit beendet haben oder Zeit abgelaufen ist, aber Non-BlockingQueues tun dies nicht. Einige Warteschlangen sind Deques, und einige Warteschlangen sind PriorityQueues.
BlockingQueue-Operationen
Neben den beiden Formen von Operationen der Warteschlange unterstützt BlockingQueue zwei weitere Formen, wie unten gezeigt.
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 |
Einige Operationen werden blockiert, bis sie ihre Arbeit beendet haben, und andere werden blockiert, bis die Zeit abgelaufen ist. Das ist alles für einen schnellen Überblick über die Warteschlange in Java. Ich hoffe, diese Java-Beispiele für Warteschlangen helfen Ihnen beim Einstieg in die Programmierung von Warteschlangensammlungen. Bitte hinterlassen Sie einen Kommentar, wenn Ihnen meine Tutorials gefallen oder wenn Sie irgendwelche Vorschläge, Probleme oder Tippfehler haben. Vielen Dank.
Source:
https://www.digitalocean.com/community/tutorials/java-queue