Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのQueueインターフェースにおけるpeek()・poll()・remove()メソッドの違いを徹底解説

JavaのQueue(キュー)インターフェースは、処理を行う前にデータを一時的に保持することを目的としたコレクションです。キューはFIFO(First-In-First-Out:先入れ先出し)方式で動作し、最初に追加された要素が最初に取り出されます。

Queueインターフェースには先頭要素を取得するためのメソッドが複数用意されており、それぞれ挙動が異なります。本記事では、peek()poll()remove()の3つのメソッドの違いを、サンプルコードと実行結果を交えて詳しく解説します。

peek()メソッド

peek()メソッドは、キューの先頭にある要素を削除せずに返します。キューの状態は変化しないため、内容を確認したいだけの場合に便利です。キューが空の場合は例外をスローせず、nullを返します。

サンプルコード

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String args[]) {
        Queue<String> queue = new LinkedList<String>();
        queue.add("Java");
        queue.add("JavaFX");
        queue.add("OpenCV");
        queue.add("Coffee Script");
        queue.add("HBase");

        System.out.println("キューの先頭の要素: " + queue.peek());

        Iterator<String> it = queue.iterator();
        System.out.println("キューの内容:");
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

実行結果

キューの先頭の要素: Java
キューの内容:
Java
JavaFX
OpenCV
Coffee Script
HBase

このように、peek()を呼び出した後も「Java」がキューに残っていることが確認できます。

poll()メソッド

poll()メソッドは、キューの先頭にある要素を返すと同時に、その要素をキューから削除します。キューが空の場合は例外をスローせず、nullを返します。

サンプルコード

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String args[]) {
        Queue<String> queue = new LinkedList<String>();
        queue.add("Java");
        queue.add("JavaFX");
        queue.add("OpenCV");
        queue.add("Coffee Script");
        queue.add("HBase");

        System.out.println("キューの先頭の要素: " + queue.poll());

        Iterator<String> it = queue.iterator();
        System.out.println("キューの内容:");
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

実行結果

キューの先頭の要素: Java
キューの内容:
JavaFX
OpenCV
Coffee Script
HBase

poll()を呼び出した後、「Java」がキューから取り除かれている点がpeek()との大きな違いです。

remove()メソッド

remove()メソッドも、キューの先頭要素を返しながら削除するという点でpoll()と同じ動作をします。ただし、キューが空だった場合の挙動が異なり、remove()nullを返す代わりにNoSuchElementExceptionをスローします。

サンプルコード

import java.util.LinkedList;
import java.util.Queue;

public class QueueRemoveExample {
    public static void main(String args[]) {
        Queue<String> queue = new LinkedList<String>();
        queue.add("Java");
        queue.add("JavaFX");

        System.out.println("削除された要素: " + queue.remove());
        System.out.println("削除された要素: " + queue.remove());

        // キューが空の状態でremove()を呼び出すと例外が発生
        try {
            queue.remove();
        } catch (Exception e) {
            System.out.println("例外が発生: " + e.getClass().getSimpleName());
        }
    }
}

実行結果

削除された要素: Java
削除された要素: JavaFX
例外が発生: NoSuchElementException

3つのメソッドの比較まとめ

メソッド 要素の削除 キューが空の場合の挙動
peek() 削除しない nullを返す
poll() 削除する nullを返す
remove() 削除する NoSuchElementExceptionをスロー

使い分けのポイント

  • 要素を確認したいだけならpeek():キューの内容を変更せずに先頭要素を参照できます。
  • 要素を取り出して処理するならpoll():FIFO方式で要素を順番に処理する場合に適しています。空チェックが不要になるため、null判定と組み合わせて安全に使えます。
  • 空のキューを異常として扱いたいならremove():キューが空であることが想定外の状況である場合、例外によって問題を早期に検知できます。

これらの違いを理解しておくことで、Queueを使ったプログラムをより安全かつ意図どおりに実装できるようになります。

  1. JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説

    はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati

  2. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って