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

omjgkv6w  于 2023-01-07  发布在  Java
关注(0)|答案(9)|浏览(358)

PriorityQueue为例
谁能给予我一个Queue的例子,其中addoffer的方法是不同的?
根据Collection文档,add方法通常会设法确保一个元素存在于Collection中,而不是添加副本,所以我的问题是,addoffer方法之间有什么区别?
是不是offer方法不管怎样都会添加重复项?(我对此表示怀疑,因为如果Collection应该只有不同的元素,这将绕过这一点)。
编辑:在PriorityQueue中,addoffer方法是相同的方法(见我下面的答案)。谁能给予我一个addoffer方法不同的类的例子?

yacmzcpb

yacmzcpb1#

我猜区别在于契约,当元素不能添加到集合中时,add方法抛出异常,而offer不抛出异常。
From: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#add%28E%29
如果一个集合拒绝添加一个特定的元素,而不是因为它已经包含了这个元素,它必须抛出一个异常(而不是返回false),这样就保持了在这个调用返回后集合总是包含指定元素的不变。
From: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html#offer%28E%29
如果可能,将指定的元素插入此队列中。使用可能强加插入限制(例如容量限制)的队列时,方法offer通常比方法Collection.add(E)更可取,后者只能通过引发异常来无法插入元素。

nbewdwxp

nbewdwxp2#

简短的回答是:* * 取决于**具体执行情况。
如果您的队列有最大容量限制,则实际上存在差异。

  • 应用案例#1(无最大容量限制):

PriorityQueue的实现没有任何区别

public boolean add(E e) {
    return offer(e);
}
// ArrayBlockingQueue which extends AbstractQueue
public boolean add(E e) {
    return super.add(e);
}

// AbstractQueue
public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}
  • offer:如果队列已满,则返回false,并且不会抛出异常
  • add:如果队列已满,则抛出异常
wztqucjr

wztqucjr3#

区别如下:

      • offer方法-尝试向队列添加元素,如果无法添加元素(例如队列已满),则返回false**,如果添加了元素,则返回***true***,并且不抛出任何特定异常。
      • add方法-尝试向队列添加元素,如果添加了元素,则返回true**,如果当前没有可用空间,则抛出IllegalStateException。
798qvoo8

798qvoo84#

offeradd之间的区别可以通过下面两段来自javadoc的摘录来解释:
Collection接口:
如果一个集合拒绝add一个特定的元素,而不是因为它已经包含了这个元素,那么它必须抛出一个异常(而不是返回false)。这将保持不变,即在这个调用返回后,集合总是包含指定的元素。
Queue接口
当使用可能强加插入限制(例如容量限制)的队列时,方法offer通常比方法Collection.add(E)更可取,后者可能仅通过引发异常来无法插入元素。
PriorityQueueQueue的实现,它不强加任何插入限制。因此addoffer方法具有相同的语义。
相比之下,ArrayBlockingQueueofferadd行为不同的实现,具体取决于队列是如何示例化的。

lh80um4z

lh80um4z5#

Queue接口指定,如果当前没有可用空间,add()将抛出IllegalStateException(否则返回true),而如果由于容量限制而无法插入元素,offer()将返回false
它们在PriorityQueue中相同的原因是该队列被指定为无界的,即没有容量限制。在没有容量限制的情况下,add()offer()的契约显示相同的行为。

qc6wkl3g

qc6wkl3g6#

来自jdk7中的源代码如下:

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

我们可以很容易地知道,add函数在成功地向队列中添加新元素时将返回true,而在失败时抛出异常。

jm81lzqq

jm81lzqq7#

我将为offer方法和add方法编写java合约示例代码,以显示它们的不同之处。

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

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

7vhp5slm8#

来源:http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html
offer方法在可能的情况下插入一个元素,否则返回false。这与Collection.add方法不同,后者只能通过引发未检查的异常来添加元素。offer方法设计用于正常而非异常情况下的失败,例如,在固定容量(或"有界")队列中。

eh57zj3b

eh57zj3b9#

offer方法抛出true或false(如果完成加法)
add方法在队列中不可能添加时引发异常

相关问题