逆順処理に適したデータ構造の比較
了解です!では「逆順処理を効率化するためのデータ構造選び」を整理してみます。
| データ構造 | 特徴 | 逆順処理のしやすさ | 実務での利用シーン |
|---|---|---|---|
| ArrayList | 配列ベース、ランダムアクセスが高速 | for (int i = size-1; i >= 0; i--) で簡単に逆順可能 | 一般的なリスト処理、インデックスが必要な場合 |
| LinkedList | 双方向リンク、要素の挿入・削除が高速 | descendingIterator() で逆順イテレーション可能 | キュー/デック処理、頻繁な挿入削除がある場合 |
| Stack | LIFO(後入れ先出し)専用構造 | pop() で自然に逆順処理 | Undo/Redo、履歴管理 |
| Deque (ArrayDeque) | 両端キュー、スタック/キュー両方の用途に対応 | pollLast() や descendingIterator() で逆順処理 | 双方向の処理、バッファ、タスク管理 |
具体例
1. ArrayList の逆順処理
List<String> list = new ArrayList<>(List.of("A", "B", "C"));
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}
Java👉 ランダムアクセスが速いので逆順ループに最適。
2. LinkedList の逆順処理
LinkedList<String> list = new LinkedList<>(List.of("A", "B", "C"));
for (Iterator<String> it = list.descendingIterator(); it.hasNext();) {
System.out.println(it.next());
}
Java👉 descendingIterator() が用意されているので自然に逆順処理できる。
3. Stack の逆順処理
Stack<String> stack = new Stack<>();
stack.push("A");
stack.push("B");
stack.push("C");
while (!stack.isEmpty()) {
System.out.println(stack.pop()); // C, B, A
}
Java👉 スタックは「逆順処理」が本来の使い方。
4. Deque の逆順処理
Deque<String> deque = new ArrayDeque<>(List.of("A", "B", "C"));
for (Iterator<String> it = deque.descendingIterator(); it.hasNext();) {
System.out.println(it.next());
}
Java👉 Deque はスタック/キュー両方の用途に対応できる万能型。
まとめ
- ArrayList → インデックスを使った逆順処理に最適
- LinkedList →
descendingIterator()で逆順が簡単 - Stack → 逆順処理が自然にできる(LIFO構造)
- Deque → 双方向処理や柔軟な用途に対応
💡 実務では「単純に逆順に走査したい → ArrayList」「履歴やUndo処理 → Stack」「双方向に処理したい → Deque」「挿入削除が多い → LinkedList」と使い分けるのがベストです。


