Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中队列中的add和offer方法有什么区别?_Java_Queue_Add - Fatal编程技术网

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
vs
add
的片段。如果元素已经可用,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