为什么Java提供了两种从队列中删除元素的方法?

时间:2010-02-03 16:21:10

标签: java queue

Java中的Queue实现有两个删除元素的方法,一个是remove(),它抛出异常,另一个是poll(),它为空队列返回null。我有两个疑问:

  1. 为什么Queue有不同的实现来删除元素?
  2. 使用哪种实现?

7 个答案:

答案 0 :(得分:23)

在某些情况下,预计队列将为空,并且在那些情况下具有不抛出异常的方法是合适的。在其他情况下,特殊情况是队列为空,并且例外是合适的。

抛出异常会导致性能下降,如果您希望队列有时是空的,您不希望必须将队列空逻辑处理为捕获异常 - 它们都是昂贵且难以阅读。

在相反的情况下,你不希望队列永远是空的,这是一个编程错误的迹象,或者它是一些其他特殊情况,你不想写丑陋的错误条件检查代码(例如,检查null),因为在这种情况下,捕获异常的可读性较低(您可以在另一个范围内执行)。

答案 1 :(得分:14)

抽象类AbstractQueue<E>实现Queue<E>并定义remove方法。

您可以查看源代码:

public E remove() {
    E x = poll();
    if (x != null)
        return x;
    else
        throw new NoSuchElementException();
}

因此,正如您所见,remove()方法使用 poll()方法。

您可以使用自己喜欢的那种。

答案 2 :(得分:5)

看看答案,我不清楚做了什么,因此:

直接来自API: remove()和poll()方法的不同之处仅在于队列为空时的行为:remove()方法抛出异常,而poll()方法返回null

答案 3 :(得分:4)

当您知道如何立即做出反应和/或期望缺少元素时,请使用民意调查。

否则请使用删除。

答案 4 :(得分:2)

Remove()方法与poll的不同之处仅在于,如果此队列为空,则抛出异常。

enter image description here

答案 5 :(得分:1)

有时您希望为空队列返回空值,有时您希望它将空队列视为异常情况。

答案 6 :(得分:0)

这两种方法在有关Queue结构的经典讨论中使用的方式不同。我主要使用poll()来检索项目,并且如果我需要在正常循环之外修改Queue,则主要删除()。