1. Übersicht
In diesem Tutorial zeigen wir, wie die ArrayDeque- Klasse von Java verwendet wird - eine Implementierung der Deque- Schnittstelle.
Ein ArrayDeque (auch als "Array Double Ended Queue" bekannt, ausgesprochen als "ArrayDeck") ist eine spezielle Art eines erweiterbaren Arrays, mit dem wir ein Element von beiden Seiten hinzufügen oder entfernen können.
Eine ArrayDeque- Implementierung kann als Stack (Last-In-First-Out) oder als Warteschlange (First-In-First-Out) verwendet werden.
2. Die API auf einen Blick
Für jede Operation haben wir grundsätzlich zwei Optionen.
Die erste Gruppe besteht aus Methoden, die eine Ausnahme auslösen, wenn die Operation fehlschlägt. Die andere Gruppe gibt einen Status oder einen Wert zurück:
Betrieb | Methode | Methode, die eine Ausnahme auslöst |
Einsetzen vom Kopf | AngebotFirst (e) | addFirst (e) |
Entfernung vom Kopf | pollFirst () | removeFirst () |
Abruf vom Kopf | peekFirst () | getFirst () |
Einsetzen vom Schwanz | quoteLast (e) | addLast (e) |
Entfernung vom Schwanz | pollLast () | removeLast () |
Abruf vom Schwanz | peekLast () | getLast () |
3. Methoden verwenden
Schauen wir uns ein einfaches Beispiel an, wie wir ArrayDeque verwenden können .
3.1. Mit ArrayDeque als Stapel
Wir beginnen mit einem Beispiel, wie wir die Klasse als Stapel behandeln können - und drücken ein Element:
@Test public void whenPush_addsAtFirst() { Deque stack = new ArrayDeque(); stack.push("first"); stack.push("second"); assertEquals("second", stack.getFirst()); }
Lassen Sie uns auch sehen, wie wir ein Element aus dem ArrayDeque entfernen können - wenn es als Stapel verwendet wird:
@Test public void whenPop_removesLast() { Deque stack = new ArrayDeque(); stack.push("first"); stack.push("second"); assertEquals("second", stack.pop()); }
Die Pop- Methode löst NoSuchElementException aus, wenn ein Stapel leer ist.
3.2. Verwenden von ArrayDeque als Warteschlange
Beginnen wir nun mit einem einfachen Beispiel, das zeigt, wie wir ein Element in einer ArrayDeque anbieten können - wenn es als einfache Warteschlange verwendet wird :
@Test public void whenOffer_addsAtLast() { Deque queue = new ArrayDeque(); queue.offer("first"); queue.offer("second"); assertEquals("second", queue.getLast()); }
Und lassen Sie uns sehen, wie wir ein Element aus einer ArrayDeque abfragen können , auch wenn es als Warteschlange verwendet wird :
@Test public void whenPoll_removesFirst() { Deque queue = new ArrayDeque(); queue.offer("first"); queue.offer("second"); assertEquals("first", queue.poll()); }
Die Poll- Methode gibt einen Nullwert zurück , wenn eine Warteschlange leer ist.
4. Wie wird ArrayDeque implementiert ?
Unter der Haube wird das ArrayDeque von einem Array unterstützt, das seine Größe verdoppelt, wenn es gefüllt wird.
Zu Beginn wird das Array mit einer Größe von 16 initialisiert. Es wird als doppelendige Warteschlange implementiert, in der zwei Zeiger verwaltet werden, nämlich ein Kopf und ein Schwanz.
Lassen Sie uns diese Logik in Aktion sehen - auf hohem Niveau.
4.1. ArrayDeque als Stapel
Wie zu sehen ist, bewegt ein Benutzer beim Hinzufügen eines Elements mithilfe der Push- Methode den Kopfzeiger um eins.
Wenn wir ein Element platzieren, setzt es das Element an der Kopfposition auf Null, damit das Element durch Müll gesammelt werden kann, und bewegt dann den Kopfzeiger um eins zurück.
4.2. ArrayDeque als Warteschlange
Wenn wir ein Element mit der Angebotsmethode hinzufügen , wird der Endzeiger um eins verschoben.
Wenn der Benutzer ein Element abfragt, setzt er das Element an der Kopfposition auf Null, damit das Element durch Müll gesammelt werden kann, und bewegt dann den Kopfzeiger.
4.3. Hinweise zu ArrayDeque
Zum Schluss noch ein paar Anmerkungen, die es wert sind, über diese spezielle Implementierung verstanden und erinnert zu werden:
- Es ist nicht threadsicher
- Nullelemente werden nicht akzeptiert
- Arbeitet deutlich schneller als der synchronisierte Stack
- Ist aufgrund der besseren Referenzlokalität eine schnellere Warteschlange als LinkedList
- Die meisten Operationen haben eine konstante zeitliche Komplexität abgeschrieben
- Ein von einem ArrayDeque zurückgegebener Iterator ist ausfallsicher
- ArrayDeque verdoppelt automatisch die Größe eines Arrays, wenn sich Kopf- und Endzeiger beim Hinzufügen eines Elements treffen
5. Schlussfolgerung
In diesem kurzen Artikel haben wir die Verwendung von Methoden in ArrayDeque veranschaulicht .
Die Implementierung all dieser Beispiele finden Sie im GitHub-Projekt. Dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und so wie es ist ausgeführt werden.