Einführung in Java ArrayDeque

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.