HOWTO · Java

Java におけるキューの offer と add

この記事では、Java のキューoffer メソッドと add メソッドの違いを紹介します。

キューは、ユーザーが先入れ先出しの方法で要素を追加できるようにするデータ構造です。Java では、キューjava.util パッケージに存在するインターフェースです。これは、データ構造内の順序付けられた要素を許可する線形構造です。

コレクションは、両端、つまり後部と前端から開いています。このプロパティを使用すると、オブジェクトをフロントエンドで追加したり、リアエンドから削除したりできます。

構造にはさまざまなメソッドがあり、その説明は以下のコードにあります。

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

public class Main {
  public static void main(String[] args) {
    Queue queue = new ArrayBlockingQueue(2);
    boolean value = false;
    value = queue.offer(1);
    System.out.println("Offer Returned Value: " + value);
    value = queue.offer(2);
    System.out.println("Offer Returned Value: " + value);
    value = queue.offer(3);
    System.out.println("Offer Returned Value: " + value);

    Queue blockingQueue = new ArrayBlockingQueue(2);
    blockingQueue.add(5);
    blockingQueue.add(10);
    blockingQueue.add(15);
  }
}

上記のコードブロックには、add メソッドと offer メソッドの両方の実装が含まれており、両方の違いを提供します。上記のコードブロックは、new キーワードを使用して queue インスタンスをインスタンス化します。

最初のステートメントは、サイズ 2 の固定容量とデフォルトのアクセスポリシーを使用して、ArrayBlockingQueue のオブジェクトを作成します。サイズ値をパラメータとして取ります。容量が 1 より小さい場合、IllegalArgumentException をスローします。

offer メソッドは、容量制限を確認した後、指定された要素をこのキューに挿入します。この関数は、追加する要素としてパラメーターを取ります。値がキューの最後に追加された場合、この関数は true を返します。それ以外の場合、false

指定された要素のクラスが要素の追加を妨げている場合、ClassCastException をスローします。指定された値が null の場合、NullPointerException が呼び出されます。IllegalArgumentException は、一部の要素プロパティによってキューへの追加が妨げられた場合にスローされます。

offer 関数の横にある print ステートメントは、ブール値 true または false を出力します。この場合も、新しい ArrayBlockingQueue がサイズ 2 の容量でインスタンス化されます。挿入が 2 回成功するまで追加してから、Exception トレースをスローします。

このメソッドは、キューに追加する要素としてパラメーターを取ります。追加が成功すると、毎回 true が返されます。それ以外の場合、値を追加できない場合は IllegalStateException がスローされます。

指定された要素のクラスがそれを追加できない場合、ClassCastException がスローされます。指定された値が null の場合は NullPointerException、この要素のプロパティがキューに追加されない場合は IllegalArgumentException

メソッド間の唯一の違いは、追加が行われた場合、offer メソッドが true または false をスローすることです。これとは対照的に、add メソッドは、キューでこれ以上追加できない場合に例外をスローします。

以下は、上記のコードブロックからの結果の出力です。

Offer Returned Value: true
Offer Returned Value: true
Offer Returned Value: false
Exception in thread "main" java.lang.IllegalStateException: Queue full
    at java.util.AbstractQueue.add(AbstractQueue.java:98)
    at java.util.concurrent.ArrayBlockingQueue.add(ArrayBlockingQueue.java:312)
    at F11.QueueAddVsOffer.main(QueueAddVsOffer.java:25)