Java ArrayDequeの紹介

Java ArrayDequeの概要

1. 概要

このチュートリアルでは、Dequeインターフェースの実装であるJavaのArrayDequeクラスの使用方法を示します。

ArrayDeque(「ArrayDouble Ended Queue」とも呼ばれ、「ArrayDeck」と発音)is a special kind of a growable array that allows us to add or remove an element from both sides.

ArrayDeque実装は、Stack(後入れ先出し)またはQueue(先入れ先出し)として使用できます。

2. APIの概要

各操作には、基本的に2つのオプションがあります。

最初のグループは、操作が失敗した場合に例外をスローするメソッドで構成されます。 他のグループは、ステータスまたは値を返します。

操作

方法

例外をスローするメソッド

頭からの挿入

オファーファースト(e)

addFirst(e)

頭からの取り外し

pollFirst()

removeFirst()

頭からの検索

peekFirst()

getFirst()

尾からの挿入

オファーラスト(e)

addLast(e)

尻尾からの取り外し

pollLast()

removeLast()

テールからの取得

peekLast()

getLast()

3. メソッドを使用する

ArrayDequeを利用する方法の簡単な例をいくつか見てみましょう。

3.1. ArrayDequeStackとして使用する

クラスをStackとして扱う方法の例から始めて、要素をプッシュします。

@Test
public void whenPush_addsAtFirst() {
    Deque stack = new ArrayDeque<>();
    stack.push("first");
    stack.push("second");

    assertEquals("second", stack.getFirst());
}

また、スタックとして使用する場合に、ArrayDequeから要素をポップする方法も見てみましょう。

@Test
public void whenPop_removesLast() {
    Deque stack = new ArrayDeque<>();
    stack.push("first");
    stack.push("second");

    assertEquals("second", stack.pop());
}

スタックが空の場合、popメソッドはNoSuchElementExceptionをスローします。

3.2. ArrayDequeQueueとして使用する

ここで、ArrayDequeで要素を提供する方法を示す簡単な例から始めましょう–単純なQueueとして使用する場合:

@Test
public void whenOffer_addsAtLast() {
    Deque queue = new ArrayDeque<>();
    queue.offer("first");
    queue.offer("second");

    assertEquals("second", queue.getLast());
}

また、Queueとして使用した場合にも、ArrayDequeから要素をポーリングする方法を見てみましょう。

@Test
public void whenPoll_removesFirst() {
    Deque queue = new ArrayDeque<>();
    queue.offer("first");
    queue.offer("second");

    assertEquals("first", queue.poll());
}

キューが空の場合、pollメソッドはnull値を返します。

4. ArrayDequeの実装方法

image内部では、ArrayDeque is backed by an array which doubles its size when it gets filled.

最初に、配列はサイズ16で初期化されます。 これは、ヘッドとテールの2つのポインタを保持する両端キューとして実装されます。

このロジックの動作を大まかに見てみましょう。

4.1. スタックとしてのArrayDeque

imageご覧のとおり、ユーザーがpushメソッドを使用して要素を追加すると、ヘッドポインターが1つ移動します。

要素をポップすると、要素がガベージコレクションされるように、ヘッド位置の要素がnullとして設定され、ヘッドポインタが1つ戻ります。

4.2. QueueとしてのArrayDeque

imageofferメソッドを使用して要素を追加すると、テールポインタが1つ移動します。

一方、ユーザーが要素をポーリングすると、要素をガベージコレクションできるように、ヘッド位置の要素をnullに設定してから、ヘッドポインターを移動します。

4.3. ArrayDequeに関する注記

最後に、この特定の実装について理解し、覚えておく価値のあるいくつかのメモ:

  • スレッドセーフではありません

  • ヌル要素は受け入れられません

  • 同期されたStackよりも大幅に高速に動作します

  • 参照の局所性が優れているため、LinkedListよりも高速なキューです

  • ほとんどの操作は、一定の時間の複雑さを償却しています

  • ArrayDequeによって返されるIteratorはフェイルファストです

  • ArrayDequeは、要素の追加中にヘッドポインタとテールポインタが互いに一致すると、配列のサイズを自動的に2倍にします。

5. 結論

この短い記事では、ArrayDequeでのメソッドの使用法を説明しました。

これらすべての例の実装は、the GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。