139

PriorityQueueたとえば、http ://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)

とメソッドが異なるQueue例を誰かに教えてもらえますか?addoffer

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

offerメソッドが関係なく重複を追加するということですか?(それは、aCollectionが別個の要素のみを持つべきである場合、これがそれを回避するためであるとは思えません)。

編集:とメソッドPriorityQueueは同じメソッドです(以下の私の答えを参照してください)。とメソッドが異なるクラスの例を教えてもらえますか?addofferaddoffer

4

8 に答える 8

180

違いはコントラクトにあると思います。要素をコレクションに追加できない場合、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)よりも、メソッドofferの方が一般的に適しています。

于 2010-04-24T09:57:44.863 に答える
36

の実装に違いはありません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");
}
于 2010-04-24T09:53:17.853 に答える
18

offerとの違いはadd、javadocsからの次の2つの抜粋で説明されています。

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

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

Queueインターフェースから

挿入制限(容量の制限など)を課す可能性のあるキューを使用する場合、例外をスローするだけで要素の挿入に失敗する可能性があるメソッドよりも、メソッドの方offerが一般的に適しています。Collection.add(E)

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

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

于 2010-04-24T10:00:12.167 に答える
16

違いは次のとおりです。

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

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

于 2018-02-24T21:06:11.410 に答える
11

Queueインターフェイスは、現在使用可能なスペースがない場合add()はをスローし(それ以外の場合はreturn )、容量の制限のために要素を挿入できなかった場合はを返すように指定します。IllegalStateExceptiontrueoffer()false

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

于 2014-06-10T20:43:19.710 に答える
8

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

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

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

于 2014-05-17T06:08:48.697 に答える
7

オファーメソッドの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
于 2017-08-02T03:10:41.093 に答える
1

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

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

于 2013-05-07T17:02:11.290 に答える