Javaのキューのaddメソッドとofferメソッドの違いは何ですか?


109

テイクPriorityQueue例えば)http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E

誰も私の例を与えることができますQueueどこaddおよびoffer方法が異なっていますか?

Collectionドキュメントによると、このaddメソッドは多くのCollection場合、重複を追加するのではなく、要素が内に存在することを確認しようとします。だから私の質問は、addofferメソッドの違いは何ですか?

それはoffer方法が重複を追加するということですか?(a Collectionが明確な要素のみを持つ必要がある場合、これはそれを回避するためだと思います)。

EDIT:ではと方法は同じ方法である(下記の私の答えを参照)。とメソッドが異なるクラスの例を誰かに教えてもらえますか?PriorityQueueaddofferaddoffer

回答:


148

違いは契約にあると思います。要素をコレクションに追加できない場合、addメソッドは例外をスローし、offerそうしません。

送信元http : //java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#add%28E%29

コレクションが特定の要素の追加を拒否した場合、その要素が既に含まれている以外の理由で、コレクションは(falseを返すのではなく)例外をスローする必要があります。これにより、この呼び出しが戻った後、コレクションには常に指定された要素が含まれるという不変条件が保持されます。

送信元http : //java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html#offer%28E%29

可能な場合、指定された要素をこのキューに挿入します。挿入制限(容量の制限など)を課す可能性のあるキューを使用する場合、例外をスローするだけで要素の挿入に失敗する可能性のあるCollection.add(E)メソッドよりも、メソッドの提供が一般的に推奨されます。


4
offer対を使用するタイミングに関するスニペットを見つけるための+1 add
Finbarr 2010

28

の実装に違いはありませんPriorityQueue.add

public boolean add(E e) {
    return offer(e);
}

以下のためにAbstractQueueそこに実際に違いがあります:

public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}

私は知っています、私は数分前に自分でその答えを投稿しました。addメソッドがメソッドと異なるクラスを知っていofferますか?
Finbarr 2010

13

offerとは、addのJavadocからこれら二つの抜粋により説明されます。

Collectionインターフェースから:

コレクションにadd特定の要素が含まれている以外の理由でコレクションが拒否した場合、コレクションは(falseを返すのではなく)例外をスローする必要があります。これにより、この呼び出しが戻った後、コレクションには常に指定された要素が含まれるという不変条件が保持されます。

Queueインターフェースから

挿入制限(容量の制限など)を課す可能性のあるキューを使用する場合、例外をスローするだけで要素の挿入に失敗する可能性があるoffermethodよりもmethodの方が一般的に推奨されCollection.add(E)ます。

PriorityQueueあるQueue任意の挿入制限を課さない実装。したがって、メソッドaddofferメソッドのセマンティクスは同じです。

対照的に、ArrayBlockingQueueは、キューがインスタンス化された方法に応じてofferadd動作が異なる実装です。


8

違いは次のとおりです。

  • offerメソッド-要素をキューに追加しようとし、要素を追加できない場合(キューがいっぱいの場合など)はfalseを返し、要素が追加された場合はtrueを返し、特定の例外をスローしません。 。

  • addメソッド-要素をキューに追加しようとします。要素が追加された場合はtrueを返します。現在使用可能なスペースがない場合はIllegalStateExceptionをスローします。


1
要素がすでに使用可能な場合、addメソッドはfalseを返しません。Queue<String> q = new PriorityQueue <>(); 文字列b = "java"; ブールis1 = q.add(b); ブールis2 = q.add( "java"); ブールis3 = q.add(b); ブールis4 = q.offer( "java"); ブールis5 = q.offer(b); ブールis6 = q.offer(b); System.out.println( "qq ::" + q);
Raj

ありがとう、Raj!上記の回答を更新しました。Oracleのドキュメントによると、「offerメソッドは可能であれば要素を挿入し、そうでない場合はfalseを返します。これは、チェックされていない例外をスローすることによってのみ要素の追加に失敗する可能性があるCollection.addメソッドとは異なります。offerメソッドは、失敗時に使用するように設計されていますたとえば、固定容量(または「制限付き」)キューでの例外的な発生ではなく、通常の発生です。」
Maksym Ovsianikov

7

次のようにjdk 7のソースコードから:

public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}

新しい要素がキューに正常に追加されるとadd関数がtrueを返し、失敗すると例外をスローすることが簡単にわかります。


5

Queueインタフェース指定add()スローされますIllegalStateExceptionにスペースが現在利用できない場合(それ以外の場合は返しtrueながら)offer()を返しますfalse要素は容量制限のために挿入することができなかった場合。

それらがa PriorityQueueで同じである理由は、このキューが無制限であると指定されている、つまり容量制限がないためです。なし容量制限の場合は、の契約add()とはoffer()同じ挙動を示します。


2

offerメソッドとaddメソッドのJavaコントラクトのサンプルコードを記述して、それらの違いを示します。

BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
        queue.add("TestQuue1");     
        queue.add("TestQuue2"); 
        queue.add("TestQuue3");  // will throw "java.lang.IllegalStateException: Queue full

BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
        queue.offer("TestQuue1");       
        queue.offer("TestQuue2");   
        queue.offer("TestQuue3"); // will not throw any exception

0

ソース: http //docs.oracle.com/javase/6/docs/api/java/util/Queue.html

offerメソッドは、可能であれば要素を挿入し、そうでない場合はfalseを返します。これは、チェックされていない例外をスローすることによってのみ要素の追加に失敗する可能性があるCollection.addメソッドとは異なります。offerメソッドは、たとえば、固定容量(または「制限付き」)キューでの障害が例外的な発生ではなく通常の発生である場合に使用するように設計されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.