139

http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)PriorityQueue为例

谁能给我一个例子,Queue说明方法addoffer方法不同的地方?

根据Collection文档,该add方法通常会寻求确保元素存在于其中Collection而不是添加重复项。add所以我的问题是,和方法有什么区别offer

是否该offer方法无论如何都会添加重复项?(我怀疑这是因为如果 aCollection应该只有不同的元素,这将绕过它)。

编辑:在 aPriorityQueue和方法中是相同的方法(见下面我的回答)addoffer谁能给我一个addoffer方法不同的类的例子?

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

如果可能,将指定元素插入此队列。当使用可能施加插入限制(例如容量限制)的队列时,方法 offer 通常比方法 Collection.add(E) 更可取,后者只能通过抛出异常而无法插入元素。

于 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 的这两个摘录解释:

Collection界面:

如果集合出于任何原因拒绝add特定元素,而不是它已经包含该元素,它必须抛出异常(而不是返回 false)。这保留了在此调用返回后集合始终包含指定元素的不变量。

Queue界面

当使用可能施加插入限制(例如容量限制)的队列时,方法offer通常比方法更可取,方法Collection.add(E)可能仅通过抛出异常而无法插入元素。

PriorityQueue是一种Queue不施加任何插入限制的实现。因此addoffer方法具有相同的语义。

相比之下,根据队列的实例化方式,ArrayBlockingQueue它的行为offer和行为有所不同。add

于 2010-04-24T10:00:12.167 回答
16

区别如下:

  • offer方法 - 尝试将元素添加到队列中,如果无法添加元素(例如队列已满),则返回false ,如果添加元素,则返回true,并且不抛出任何特定异常.

  • add方法 - 尝试将元素添加到队列中,如果添加了元素,则返回true,如果当前没有可用空间,则抛出 IllegalStateException。

于 2018-02-24T21:06:11.410 回答
11

Queue接口指定如果当前没有可用空间(否则返回)add()将抛出一个,而如果由于容量限制而无法插入元素则将返回。IllegalStateExceptiontrueoffer()false

它们在 a 中相同的原因PriorityQueue是该队列被指定为无界的,即没有容量限制。在没有容量限制的情况下,add()和的合约offer()表现出相同的行为。

于 2014-06-10T20:43:19.710 回答
8

来自jdk 7中的源代码如下:

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

我将为 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
于 2017-08-02T03:10:41.093 回答
1

来源:http ://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

如果可能,offer 方法插入一个元素,否则返回 false。这与 Collection.add 方法不同,后者只能通过抛出未经检查的异常才能添加元素。offer 方法设计用于当故障是正常而不是异常发生时使用,例如,在固定容量(或“有界”)队列中。

于 2013-05-07T17:02:11.290 回答