【问题标题】:Why Java provides two methods to remove element from Queue?为什么 Java 提供了两种从队列中移除元素的方法?
【发布时间】:2011-01-12 16:50:03
【问题描述】:

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

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

【问题讨论】:

    标签: java queue


    【解决方案1】:

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

    否则使用删除。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          在某些情况下,期望队列为空,在这些情况下,使用不抛出异常的方法是合适的。在其他情况下,队列为空是一种例外情况,并且是适当的例外。

          抛出异常会导致性能损失,如果您希望队列不时为空,您不希望将队列空逻辑处理为捕获异常 - 这两者都是成本高且难以阅读。

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

          【讨论】:

          • 这个答案解释了基本的区别,只是没有说清楚,哪个抛出异常,哪个没有。
          • add()remove() 会抛出异常,而 offer()poll() 不会。
          【解决方案5】:

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

          你可以看一下源码:

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

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

          你可以使用你喜欢的那个。

          【讨论】:

          • 我正在使用这个 poll() 调用来实现我的队列。令人惊讶的是,它会抛出 NoSuchElementException。有什么解释吗? -.-
          • 也许你同时访问队列?
          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 最好将其作为文本传递,使用 > 引用
            猜你喜欢
            • 2021-05-26
            • 2011-08-30
            • 1970-01-01
            • 2011-02-22
            • 2016-03-05
            • 2023-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多