1. 導入:なぜQueueが必要なのか
Javaでプログラミングをしていると、「先に入れたデータを順番に取り出したい」という場面によく遭遇します。例えば、Webサイトの閲覧履歴や、タスク管理の待ち行列などです。リスト(List)でも代用できそうに思えますが、専用のQueue(キュー)インターフェースを使うことで、データの追加と取り出しのルールが明確になり、より安全で読みやすいコードを書くことができます。
2. 基礎知識:Queueの仕組み
Queueは「先入れ先出し(FIFO: First-In-First-Out)」という原則に従うデータ構造です。
JavaのコレクションフレームワークにおけるQueueは、主にLinkedListなどのクラスで実装されます。Queueの特徴は、「末尾に追加し、先頭から取り出す」という点にあります。
Queueにはメソッドが2種類ずつ存在します。大きな違いは「操作に失敗した時の挙動」です。
・例外を投げるグループ:add, remove, element
・特殊な値を返すグループ:offer, poll, peek
初心者の方は、プログラムが意図せず停止しないよう、安全性の高い「特殊な値を返すグループ」を優先的に使うのがおすすめです。
3. 実装と解決策:主要メソッドの使い分け
・offer(): キューの末尾に要素を追加します。
・poll(): キューの先頭要素を取得し、同時に削除します。空の場合はnullを返します。
・peek(): キューの先頭要素を取得しますが、削除はしません。空の場合はnullを返します。
・remove(): pollと同じですが、空の場合に例外(NoSuchElementException)を投げます。
・element(): peekと同じですが、空の場合に例外を投げます。
4. サンプルプログラム
以下のコードをコピーして、Queueの動きを確認してみてください。
import java.util.LinkedList;
import java.util.Queue;
public class QueueSample {
public static void main(String[] args) {
// LinkedListを使ってQueueを実装
Queue
// データの追加(offerを使用)
queue.offer(“タスク1”);
queue.offer(“タスク2”);
queue.offer(“タスク3”);
// 先頭を確認(peekを使用:削除しない)
System.out.println(“次に処理するのは: ” + queue.peek());
// データの取り出し(pollを使用:削除する)
while (!queue.isEmpty()) {
String task = queue.poll();
System.out.println(“処理中: ” + task);
}
// 空の状態でpollを呼ぶとnullが返る(安全)
System.out.println(“キューの中身: ” + queue.poll());
}
}
5. 応用・注意点:現場でのポイント
現場のコードで特に注意すべきは「nullの扱い」です。例えば、PriorityQueueのような一部のQueue実装では、null要素の追加が禁止されています。また、マルチスレッド環境(複数の処理が同時に動く環境)でQueueを扱う場合は、通常のLinkedListではなく、java.util.concurrentパッケージにあるConcurrentLinkedQueueなど、スレッドセーフな実装を選択する必要があります。
まずは、Listの代わりにQueueを使う場面がないか、コードを見直してみてください。データの流れがスッキリと整理されるはずです。

コメント