Einführung in Java ArrayDeque
1. Überblick
In diesem Tutorial zeigen wir, wie dieArrayDeque-Klasse von Java verwendet wird - eine Implementierung derDeque-Schnittstelle.
EinArrayDeque (auch als "Array Double Ended Queue" bekannt, ausgesprochen als "ArrayDeck")is a special kind of a growable array that allows us to add or remove an element from both sides.
EineArrayDeque-Implementierung kann alsStack (Last-In-First-Out) oderQueue (First-In-First-Out) verwendet werden.
2. Die API auf einen Blick
Grundsätzlich haben wir für jede Operation zwei Möglichkeiten.
Die erste Gruppe besteht aus Methoden, die eine Ausnahme auslösen, wenn der Vorgang 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 wirArrayDeque verwenden können.
3.1. Verwenden vonArrayDeque alsStack
Wir beginnen mit einem Beispiel, wie wir die Klasse alsStack 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 ausArrayDeque 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 Methodepop löstNoSuchElementException aus, wenn ein Stapel leer ist.
3.2. Verwenden vonArrayDeque alsQueue
Beginnen wir nun mit einem einfachen Beispiel, das zeigt, wie wir ein Element inArrayDeque anbieten können - wenn es als einfachesQueue 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 ausArrayDeque abfragen können, auch wenn es alsQueue verwendet wird:
@Test
public void whenPoll_removesFirst() {
Deque queue = new ArrayDeque<>();
queue.offer("first");
queue.offer("second");
assertEquals("first", queue.poll());
}
Die Methodepoll gibt einen Wert vonnullzurück, wenn eine Warteschlange leer ist.
4. Wie wirdArrayDequeimplementiert?
Unter der Haube befinden sich dieArrayDeque is backed by an array which doubles its size when it gets filled.
Das Array wird zunächst mit einer Größe von 16 initialisiert. Es ist 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 mit der Methodepush den Kopfzeiger um eins.
Wenn wir ein Element platzen lassen, setzt es das Element an der Kopfposition aufnull, damit das Element durch Müll gesammelt werden kann, und bewegt dann den Kopfzeiger um eins zurück.
4.2. ArrayDeque alsQueue
Wenn der Benutzer ein Element abfragt, setzt er das Element an der Kopfposition auf Null, damit das Element überflüssig wird, und bewegt dann den Kopfzeiger.
4.3. Anmerkungen zuArrayDeque
Zum Schluss noch ein paar Anmerkungen zum Verständnis und zur Erinnerung an diese spezielle Implementierung:
-
Es ist nicht threadsicher
-
Null-Elemente werden nicht akzeptiert
-
Arbeitet deutlich schneller als die synchronisiertenStack
-
Ist aufgrund der besseren Referenzlokalität eine schnellere Warteschlange alsLinkedList
-
Die meisten Operationen haben eine konstante zeitliche Komplexität amortisiert
-
EinIterator, das von einemArrayDeque zurückgegeben wird, ist ausfallsicher
-
ArrayDeque verdoppelt automatisch die Größe eines Arrays, wenn sich Kopf- und Endzeiger beim Hinzufügen eines Elements treffen
5. Fazit
In diesem kurzen Artikel haben wir die Verwendung von Methoden inArrayDeque veranschaulicht.
Die Implementierung all dieser Beispiele kann inthe GitHub project gefunden werden; Dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und so wie es ist ausgeführt werden.