以PriorityQueue
为例
谁能给予我一个Queue
的例子,其中add
和offer
的方法是不同的?
根据Collection
文档,add
方法通常会设法确保一个元素存在于Collection
中,而不是添加副本,所以我的问题是,add
和offer
方法之间有什么区别?
是不是offer
方法不管怎样都会添加重复项?(我对此表示怀疑,因为如果Collection
应该只有不同的元素,这将绕过这一点)。
编辑:在PriorityQueue
中,add
和offer
方法是相同的方法(见我下面的答案)。谁能给予我一个add
和offer
方法不同的类的例子?
9条答案
按热度按时间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)更可取,后者只能通过引发异常来无法插入元素。
nbewdwxp2#
简短的回答是:* * 取决于**具体执行情况。
如果您的队列有最大容量限制,则实际上存在差异。
与
PriorityQueue
的实现没有任何区别:ArrayBlockingQueue
的实现扩展了AbstractQueue
:offer
:如果队列已满,则返回false
,并且不会抛出异常add
:如果队列已满,则抛出异常wztqucjr3#
区别如下:
798qvoo84#
offer
和add
之间的区别可以通过下面两段来自javadoc的摘录来解释:从
Collection
接口:如果一个集合拒绝
add
一个特定的元素,而不是因为它已经包含了这个元素,那么它必须抛出一个异常(而不是返回false)。这将保持不变,即在这个调用返回后,集合总是包含指定的元素。从
Queue
接口当使用可能强加插入限制(例如容量限制)的队列时,方法
offer
通常比方法Collection.add(E)
更可取,后者可能仅通过引发异常来无法插入元素。PriorityQueue
是Queue
的实现,它不强加任何插入限制。因此add
和offer
方法具有相同的语义。相比之下,
ArrayBlockingQueue
是offer
和add
行为不同的实现,具体取决于队列是如何示例化的。lh80um4z5#
Queue
接口指定,如果当前没有可用空间,add()
将抛出IllegalStateException
(否则返回true
),而如果由于容量限制而无法插入元素,offer()
将返回false
。它们在
PriorityQueue
中相同的原因是该队列被指定为无界的,即没有容量限制。在没有容量限制的情况下,add()
和offer()
的契约显示相同的行为。qc6wkl3g6#
来自jdk7中的源代码如下:
我们可以很容易地知道,add函数在成功地向队列中添加新元素时将返回true,而在失败时抛出异常。
jm81lzqq7#
我将为
offer
方法和add
方法编写java合约示例代码,以显示它们的不同之处。7vhp5slm8#
来源:http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html
offer方法在可能的情况下插入一个元素,否则返回false。这与Collection.add方法不同,后者只能通过引发未检查的异常来添加元素。offer方法设计用于正常而非异常情况下的失败,例如,在固定容量(或"有界")队列中。
eh57zj3b9#
offer方法抛出true或false(如果完成加法)
add方法在队列中不可能添加时引发异常