Java中队列中的add和offer方法有什么区别?
以Java中队列中的add和offer方法有什么区别?,java,queue,add,Java,Queue,Add,以PriorityQueue为例 谁能给我举一个例子,说明不同的方法和方法 根据doc的说法,add方法通常会寻求确保集合中存在元素,而不是添加重复项。所以我的问题是,add和offer方法之间有什么区别 offer方法是否会添加重复项?(我怀疑这是因为如果一个集合只应该有不同的元素,这将避免这种情况) 编辑: 在PriorityQueue中,add和offer方法是相同的方法(参见下面我的答案)。谁能给我举一个类的例子,其中add和offer方法不同?优先级队列的实现没有区别。add: pub
PriorityQueue
为例
谁能给我举一个例子,说明不同的方法和方法
根据doc的说法,add
方法通常会寻求确保集合中存在元素,而不是添加重复项。所以我的问题是,add
和offer
方法之间有什么区别
offer
方法是否会添加重复项?(我怀疑这是因为如果一个集合
只应该有不同的元素,这将避免这种情况)
编辑:
在PriorityQueue
中,add
和offer
方法是相同的方法(参见下面我的答案)。谁能给我举一个类的例子,其中add
和offer
方法不同?优先级队列的实现没有区别。add
:
public boolean add(E e) {
return offer(e);
}
因为实际上有一个区别:
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
我猜区别在于契约中,当元素不能添加到集合中时,
add
方法抛出异常,offer
不抛出异常
发件人:
如果集合拒绝添加
任何原因的特定元素
除此之外,它已经包含
元素,它必须抛出一个
异常(而不是返回)
错误)。这保留了不变量
集合始终包含
此调用后指定的元素
返回
发件人:
将指定的元素插入到
如果可能,请输入此队列。使用时
可能强制插入的队列
限制(例如容量)
边界),方法提供通常是
比方法更可取
Collection.add(E),它可能无法
仅通过抛出
例外
offer
和add
之间的区别可以从javadocs的以下两个摘录中得到解释:
从界面:
如果集合拒绝添加某个特定元素,而不是因为它已经包含该元素,那么它必须抛出异常(而不是返回false)。这保留了在调用返回后集合始终包含指定元素的不变量
从接口
当使用可能施加插入限制(例如容量限制)的队列时,方法offer
通常比方法Collection.add(E)
更可取,后者只能通过抛出异常才能插入元素
PriorityQueue
是一个Queue
实现,它不施加任何插入限制。因此,add
和offer
方法具有相同的语义
相比之下,ArrayBlockingQueue
是一种实现,其中offer
和add
的行为不同,具体取决于队列的实例化方式。来源:
如果可能,offer方法将插入一个元素,否则返回false。这与Collection.add方法不同,后者仅通过引发未检查的异常才能添加元素。offer方法设计用于当故障是正常而非异常情况时使用,例如,在固定容量(或“有界”)队列中。来自jdk 7中的源代码,如下所示:
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
我们可以很容易地知道,当成功地将新元素添加到队列中时,add函数将返回true,但在失败时抛出异常。队列接口指定
add()
如果当前没有可用空间,将抛出非法状态异常
如果由于容量限制而无法插入元素,则offer()
将返回false
它们在
PriorityQueue
中相同的原因是该队列被指定为无界队列,即没有容量限制。在没有容量限制的情况下,add()
和offer()
的合同显示相同的行为。我将为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
BlockingQueue=newarrayblockingqueue(2);
添加(“TestQuue1”);
添加(“TestQuue2”);
queue.add(“TestQuue3”);//将抛出“java.lang.IllegalStateException:队列已满”
BlockingQueue=new ArrayBlockingQueue(2);
排队报价(“测试报价1”);
排队。报价(“TestQuue2”);
queue.offer(“TestQuue3”);//不会引发任何异常
区别如下:
- offer方法-尝试将元素添加到队列中,如果无法添加元素(如队列已满),则返回false;如果添加元素,则返回true,并且不会引发任何特定异常
- add方法-尝试将元素添加到队列,如果元素已添加,则返回true,如果当前没有可用空间,则抛出非法状态异常
add
方法与offer
方法不同吗?+1用于查找关于何时使用offer
vsadd
的片段。如果元素已经可用,add方法永远不会返回false队列q=new PriorityQueue();String b=“java”;boolean is1=q.add(b);boolean is2=q.add(“java”);boolean is3=q.add(b);boolean is4=q.offer(“java”);boolean is5=q.offer(b);boolean is6=q.offer(b);System.out.println(“qq:”+q);谢谢,Raj!我已经更新了上面的回复。Oracle文档中说:“o