Java中的队列中的添加和报价方法有什么区别?
以PriorityQueue
为例,例如http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)
任何人都可以给我一个Queue
的例子add
和offer
方法是不同的?
根据Collection
文档, add
方法通常会确保在Collection
存在一个元素,而不是添加重复项。 所以我的问题是, add
和offer
方法有什么区别?
offer
方法是不是会添加重复项? (我怀疑这是因为如果一个Collection
只应该有不同的元素,这将绕过这一点)。
编辑:在PriorityQueue
add
和offer
方法是相同的方法(请参阅我的答案下面)。 任何人都可以给我一个类add
和offer
方法不同的例子吗?
我想合同的区别在于,当元素不能被添加到集合中时, 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"); }
offer
和add
的区别在于javadocs的这两个摘录:
从Collection
界面:
如果一个集合因为除了它已经包含的元素之外的任何原因而拒绝
add
一个特定的元素,它必须抛出一个exception(而不是返回false)。 这保留了这个调用返回后,一个集合总是包含指定元素的不variables。
从Queue
界面
当使用可能施加插入限制的队列(例如容量界限)时,方法
offer
通常比方法Collection.add(E)
更可取,方法Collection.add(E)
只能通过抛出exception来插入元素。
PriorityQueue
是一个Queue
实现,不会强加任何插入限制。 因此, add
和offer
方法具有相同的语义。
相比之下, ArrayBlockingQueue
是一个实现,其中offer
和add
行为有所不同,具体取决于队列是如何实例化的。
从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