Java队列中的add和offer方法有什么区别?


109

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

谁能给我一个例子,Queue其中addoffer方法有所不同?

根据Collection文档,该add方法通常会试图确保元素存在Collection而不是添加重复元素。所以我的问题是addoffer方法之间有什么区别?

offer方法是否会添加重复项?(我怀疑这是因为如果a Collection仅包含不同的元素,则会绕开它)。

编辑:在PriorityQueueaddoffer方法是相同的方法(见我的回答如下)。谁能给我一个与addoffer方法不同的类的示例?

Answers:


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

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


4
+1查找有关何时使用offervs的摘要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由javadocs的以下两个摘录解释:

Collection界面:

如果某个集合由于add某个特定元素而不是已经包含该元素的其他原因拒绝了该元素,则它必须引发异常(而不是返回false)。这保留了不变,即在此调用返回之后,集合始终包含指定的元素。

Queue界面

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

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

相反,ArrayBlockingQueue是一种实现,其中offer和的add行为不同,具体取决于队列的实例化方式。


8

区别如下:

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

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


1
如果该元素已经可用,则add方法永远不会返回false Queue <String> q = new PriorityQueue <>(); 字符串b =“ java”; 布尔值is1 = q.add(b); boolean is2 = q.add(“ java”); 布尔值is3 = q.add(b); boolean is4 = q.offer(“ java”); 布尔值is5 = q.offer(b); 布尔值is6 = q.offer(b); System.out.println(“ qq ::” + q);
拉吉(Raj)

谢谢,拉杰!我已经在上面更新了我的回复。Oracle文档说:“ offer方法在可能的情况下插入一个元素,否则返回false。这与Collection.add方法不同,Collection.add方法只能通过引发未经检查的异常来添加元素。是正常情况,而不是例外情况,例如在固定容量(或“有界”)队列中。”
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如果元素不能由于容量限制插入。

它们之所以相同的原因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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.