Java ArrayDeque完全ガイド:主要メソッドとスタック実装
Java ArrayDeque
ArrayDequeクラス、そのメソッド、実践的な例(スタックとしての使用法を含む)を解説します。
Javaにおいて、ArrayDequeはサイズ可変配列をバックエンドとするキューとデックのデータ構造を実装します。
ArrayDequeが実装するインターフェース
ArrayDequeクラスは以下のインターフェースを実装します:
- Java Queueインターフェース
- Java Dequeインターフェース

ArrayDequeの作成
まずパッケージをインポートします:
import java.util.ArrayDeque;
型付きデックをインスタンス化します:
ArrayDeque<Type> deque = new ArrayDeque<>();
例:
// String型のデック
ArrayDeque<String> animals = new ArrayDeque<>();
// Integer型のデック
ArrayDeque<Integer> ages = new ArrayDeque<>();
ArrayDequeの主要メソッド
要素の挿入
1. add()、addFirst()、addLast()の使用
add(E e)-eを末尾に追加addFirst(E e)-eを先頭に挿入addLast(E e)-add()と同等
IllegalStateExceptionをスローします。ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.addFirst("Cat");
animals.addLast("Horse");
System.out.println("ArrayDeque: " + animals);
出力
ArrayDeque: [Cat, Dog, Horse]
2. offer()、offerFirst()、offerLast()の使用
offer(E e)-eを末尾に追加、成功時はtrueを返すofferFirst(E e)-eを先頭に挿入offerLast(E e)-offer()と同等
falseを返します。ArrayDeque<String> animals = new ArrayDeque<>();
animals.offer("Dog");
animals.offerFirst("Cat");
animals.offerLast("Horse");
System.out.println("ArrayDeque: " + animals);
出力
ArrayDeque: [Cat, Dog, Horse]
要素へのアクセス
1. getFirst()とgetLast()
getFirst()- 先頭要素を返すgetLast()- 末尾要素を返す
NoSuchElementExceptionをスローします。ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
System.out.println("最初の要素: " + animals.getFirst());
System.out.println("最後の要素: " + animals.getLast());
出力
ArrayDeque: [Dog, Cat, Horse] 最初の要素: Dog 最後の要素: Horse
2. peek()、peekFirst()、peekLast()
peek()- 削除せずに先頭を取得peekFirst()-peek()の別名peekLast()- 末尾を取得
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
System.out.println("ヘッド要素: " + animals.peek());
System.out.println("最初の要素: " + animals.peekFirst());
System.out.println("最後の要素: " + animals.peekLast());
出力
ArrayDeque: [Dog, Cat, Horse] ヘッド要素: Dog 最初の要素: Dog 最後の要素: Horse
peek()系は例外をスローせずnullを返します。要素の削除
1. remove()、removeFirst()、removeLast()
remove()- 先頭を削除して返すremoveFirst()-remove()と同等removeLast()- 末尾を削除して返すremove(Object o)-oの最初の出現を削除(存在する場合)
remove(o)でoが見つからない場合NoSuchElementExceptionをスローします。ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
System.out.println("削除された要素: " + animals.remove());
System.out.println("新しいArrayDeque: " + animals);
System.out.println("削除された最初の要素: " + animals.removeFirst());
System.out.println("削除された最後の要素: " + animals.removeLast());
出力
ArrayDeque: [Dog, Cat, Cow, Horse] 削除された要素: Dog 新しいArrayDeque: [Cat, Cow, Horse] 削除された最初の要素: Cat 削除された最後の要素: Horse
2. poll()、pollFirst()、pollLast()
poll()- 先頭を削除して返す、空ならnullpollFirst()-poll()の別名pollLast()- 末尾を削除して返す
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
System.out.println("削除された要素: " + animals.poll());
System.out.println("新しいArrayDeque: " + animals);
System.out.println("削除された最初の要素: " + animals.pollFirst());
System.out.println("削除された最後の要素: " + animals.pollLast());
出力
ArrayDeque: [Dog, Cat, Cow, Horse] 削除された要素: Dog 新しいArrayDeque: [Cat, Cow, Horse] 削除された最初の要素: Cat 削除された最後の要素: Horse
3. clear()
デック全体を空にします。
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
animals.clear();
System.out.println("新しいArrayDeque: " + animals);
出力
ArrayDeque: [Dog, Cat, Horse] 新しいArrayDeque: []
ArrayDequeのイテレーション
iterator()- 前方イテレータdescendingIterator()- 逆順イテレータ
ArrayDeque<String> animals = new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.print("ArrayDeque: ");
Iterator<String> it = animals.iterator();
while(it.hasNext()) {
System.out.print(it.next() + ", ");
}
System.out.print("\nArrayDeque(逆順): ");
Iterator<String> rev = animals.descendingIterator();
while(rev.hasNext()) {
System.out.print(rev.next() + ", ");
}
出力
ArrayDeque: [Dog, Cat, Horse] ArrayDeque(逆順): [Horse, Cat, Dog]
その他の一般的なメソッド
| メソッド | 説明 |
|---|---|
element() | 削除せずにヘッドを取得 |
contains(Object o) | oの存在確認。見つかればtrue |
size() | デックの要素数 |
toArray() | デックを配列に変換 |
clone() | デックのシャローコピーを作成 |
ArrayDequeをスタックとして使用
LIFO動作には、StackよりArrayDequeが適しています。パフォーマンスが良く、レガシーな同期オーバーヘッドがないためです。
スタック風メソッド:
push(E e)- 先頭に追加peek()- トップ要素を削除せずに取得pop()- トップ要素を削除して返す
ArrayDeque<String> stack = new ArrayDeque<>();
stack.push("Dog");
stack.push("Cat");
stack.push("Horse");
System.out.println("Stack: " + stack);
System.out.println("アクセスされた要素: " + stack.peek());
System.out.println("削除された要素: " + stack.pop());
出力
Stack: [Horse, Cat, Dog] アクセスされた要素: Horse 削除された要素: Horse
ArrayDeque vs LinkedList
両方ともDequeを実装しますが、違いがあります:
LinkedListはnull要素を許可。ArrayDequeは許可しない- LinkedListのノードはポインタを保持し、より多くのメモリを消費
- キュー/デックワークロードでは、
ArrayDequeが通常LinkedListより高性能
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較