Java中的队列中的添加和报价方法有什么区别?

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

任何人都可以给我一个Queue的例子addoffer方法是不同的?

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

offer方法是不是会添加重复项? (我怀疑这是因为如果一个Collection只应该有不同的元素,这将绕过这一点)。

编辑:在PriorityQueue addoffer方法是相同的方法(请参阅我的答案下面)。 任何人都可以给我一个类addoffer方法不同的例子吗?

我想合同的区别在于,当元素不能被添加到集合中时, add方法会抛出一个exception,并且offer不会。

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

如果一个集合因为除了它已经包含的元素之外的任何原因而拒绝添加一个特定的元素,它必须抛出一个exception(而不是返回false)。 这保留了这个调用返回后,一个集合总是包含指定元素的不variables。

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

如果可能,将指定的元素插入此队列中。 当使用可能施加插入限制的队列(例如容量界限)时,方法提供通常比方法Collection.add(E)更可取,方法Collection.add(E)只能通过抛出exception来插入元素。

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"); } 

offeradd的区别在于javadocs的这两个摘录:

Collection界面:

如果一个集合因为除了它已经包含的元素之外的任何原因而拒绝add一个特定的元素,它必须抛出一个exception(而不是返回false)。 这保留了这个调用返回后,一个集合总是包含指定元素的不variables。

Queue界面

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

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

相比之下, ArrayBlockingQueue是一个实现,其中offeradd行为有所不同,具体取决于队列是如何实例化的。

从jdk 7中的源代码如下:

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

我们可以很容易地知道add函数在队列中成功添加一个新元素时会返回true,但是失败时会抛出一个exception。

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

它们在PriorityQueue相同的原因是这个队列被指定为无界的,即没有容量限制。 在没有容量限制的情况下, add()offer()的合约显示相同的行为。

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

如果可能,offer方法插入一个元素,否则返回false。 这与Collection.add方法不同,后者可能无法仅通过抛出未经检查的exception来添加元素。 报价方法是为故障是正常的情况而devise的,而不是例外情况,例如在固定容量(或“有界”)的队列中。

我将编写提供方法的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