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. ArrayDequeをStackとして使用する
クラスを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. ArrayDequeをQueueとして使用する
ここで、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の実装方法
最初に、配列はサイズ16で初期化されます。 これは、ヘッドとテールの2つのポインタを保持する両端キューとして実装されます。
このロジックの動作を大まかに見てみましょう。
4.1. スタックとしてのArrayDeque
要素をポップすると、要素がガベージコレクションされるように、ヘッド位置の要素がnullとして設定され、ヘッドポインタが1つ戻ります。
4.2. QueueとしてのArrayDeque
一方、ユーザーが要素をポーリングすると、要素をガベージコレクションできるように、ヘッド位置の要素をnullに設定してから、ヘッドポインターを移動します。
4.3. ArrayDequeに関する注記
最後に、この特定の実装について理解し、覚えておく価値のあるいくつかのメモ:
-
スレッドセーフではありません
-
ヌル要素は受け入れられません
-
同期されたStackよりも大幅に高速に動作します
-
参照の局所性が優れているため、LinkedListよりも高速なキューです
-
ほとんどの操作は、一定の時間の複雑さを償却しています
-
ArrayDequeによって返されるIteratorはフェイルファストです
-
ArrayDequeは、要素の追加中にヘッドポインタとテールポインタが互いに一致すると、配列のサイズを自動的に2倍にします。
5. 結論
この短い記事では、ArrayDequeでのメソッドの使用法を説明しました。
これらすべての例の実装は、the GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。