以http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)PriorityQueue为例
任何人都可以给我一个例子,Queue其中add和offer方法不同?
根据该Collection文档,该add方法通常会寻求确保元素存在于Collection而不是添加重复项中.所以我的问题是,add和offer方法有什么区别?
这个offer方法是否会添加重复项?(我怀疑这是因为如果一个Collection应该只有不同的元素,这将绕过那个).
编辑:在PriorityQueue中add和offer方法是相同的方法(见我的回答如下).任何人都可以给我一个类add和offer例子不同的例子吗?
dvd*_*dvd 139
我想差异在于契约,当元素无法添加到集合时,该add方法抛出异常而offer不是.
来自:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#add%28E%29
如果一个集合因为已经包含该元素的原因而拒绝添加特定元素,那么它必须抛出异常(而不是返回false).这保留了在此调用返回后集合始终包含指定元素的不变量.
来自:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html#offer%28E%29
如果可能,将指定的元素插入此队列.当使用可能施加插入限制的队列(例如容量边界)时,方法提供通常优于方法Collection.add(E),它只能通过抛出异常而无法插入元素.
Pet*_*ang 25
实施方式没有区别PriorityQueue.add:
public boolean add(E e) {
return offer(e);
}
Run Code Online (Sandbox Code Playgroud)
因为AbstractQueue实际上存在差异:
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*n C 12
这两个来自javadocs的摘录解释了offer和之间的区别add:
从Collection界面:
如果一个集合
add因为已经包含该元素的原因而拒绝某个特定元素,那么它必须抛出一个异常(而不是返回false).这保留了在此调用返回后集合始终包含指定元素的不变量.
从Queue界面
当使用可能施加插入限制的队列(例如容量边界)时,方法
offer通常优于方法Collection.add(E),该方法仅通过抛出异常而无法插入元素.
PriorityQueue是一种Queue不强加任何插入限制的实现.因此,add和offer方法具有相同的语义.
相反,它ArrayBlockingQueue是一种实现,其行为offer和add行为不同,具体取决于队列的实例化方式.
Pet*_*ter 11
该Queue接口指定了add()将抛出IllegalStateException,如果没有空间是目前可用的(否则返回true时)offer()将返回false如果元素不能由于容量限制插入。
它们在 a 中相同的原因PriorityQueue是该队列被指定为无界,即没有容量限制。在没有容量限制的情况下,add()和的合同offer()显示相同的行为。
小智 6
从jdk 7中的源代码如下:
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
Run Code Online (Sandbox Code Playgroud)
我们可以很容易地知道,当成功地将新元素添加到队列中时,add函数将返回true,但在失败时抛出异常.
我将为 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
Run Code Online (Sandbox Code Playgroud)
区别如下:
offer方法-尝试将元素添加到队列中,如果无法添加元素(如队列已满),则返回false;如果添加了元素且不引发任何特定异常,则返回true。
add方法-尝试将元素添加到队列中,如果添加了元素,则返回true;如果当前没有可用空间,则抛出IllegalStateException。
| 归档时间: |
|
| 查看次数: |
81915 次 |
| 最近记录: |