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

Why Java provides two methods to remove element from Queue?

Java中的Queue实现有两种删除元素的方法,一种是引发异常的remove(),另一种是针对空队列返回nullpoll()。 我有两个疑问:

  • 为什么Queue具有不同的实现来删除元素?
  • 什么时候使用哪个实现?

  • 在某些情况下,预计队列将为空,在这种情况下,使用不引发异常的方法是合适的。在其他情况下,队列为空是一种特殊情况,并且例外是适当的。

    引发异常会导致性能下降,并且如果您希望队列不时为空,那么您就不必将队列空逻辑视为捕获异常,这既昂贵又困难阅读。

    在相反的情况下,您不希望队列为空,这是编程错误或其他异常情况的征兆,并且您不想编写难看的错误条件检查代码(例如,检查表示为null),因为在这种情况下,它比捕获异常(您可以在另一个作用域中进行捕获)的可读性差。


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

    您可以看一下源代码:

    1
    2
    3
    4
    5
    6
    7
    public E remove() {
        E x = poll();
        if (x != null)
            return x;
        else
            throw new NoSuchElementException();
    }

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

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


    查看答案,我不清楚是做什么的,因此:

    直接来自API:
    仅当队列为空时,remove()和poll()方法的行为不同:remove()方法引发异常,而poll()方法返回null


    当您知道如何立即做出反应和/或期望元素不存在时,请使用poll。

    否则,请使用删除。


    remove()方法与poll的不同之处仅在于,如果此队列为空,它将引发异常。

    enter image description here


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


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