Einführung in Java ArrayDeque

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?

image 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

image 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

image Wenn wir ein Element mit der Methodeoffer 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 ü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.