【发布时间】:2011-01-12 16:50:03
【问题描述】:
Java 中的Queue 实现有两种删除元素的方法,一种是remove(),它会抛出异常,另一种是poll(),它为空队列返回null。我有两个疑问:
- 为什么
Queue有不同的实现来删除元素? - 何时使用哪个实现?
【问题讨论】:
Java 中的Queue 实现有两种删除元素的方法,一种是remove(),它会抛出异常,另一种是poll(),它为空队列返回null。我有两个疑问:
Queue 有不同的实现来删除元素?【问题讨论】:
当您知道如何立即做出反应和/或期望元素不存在时,请使用民意调查。
否则使用删除。
【讨论】:
有时您希望为空队列返回空值,有时您希望它将空队列视为异常情况。
【讨论】:
在有关队列结构的经典讨论中,这两种方法的使用方式不同。我主要使用 poll() 来检索项目,如果我需要在正常循环之外修改队列,我主要使用 remove()。
【讨论】:
在某些情况下,期望队列为空,在这些情况下,使用不抛出异常的方法是合适的。在其他情况下,队列为空是一种例外情况,并且是适当的例外。
抛出异常会导致性能损失,如果您希望队列不时为空,您不希望将队列空逻辑处理为捕获异常 - 这两者都是成本高且难以阅读。
在您不希望队列永远为空的相反情况下,这表明存在编程错误或其他一些特殊情况,并且您不想编写丑陋的错误条件检查代码(例如检查空值),因为在这种情况下,它的可读性不如捕获异常(您可以在另一个范围内执行)。
【讨论】:
add() 和 remove() 会抛出异常,而 offer() 和 poll() 不会。
抽象类AbstractQueue<E>实现Queue<E>并定义remove方法。
你可以看一下源码:
public E remove() {
E x = poll();
if (x != null)
return x;
else
throw new NoSuchElementException();
}
如您所见,remove() 方法使用 poll() 方法。
你可以使用你喜欢的那个。
【讨论】:
看着答案,我不清楚哪个做了什么,因此:
直接来自 API: remove() 和 poll() 方法的区别仅在于队列为空时的行为:remove() 方法抛出异常,而 poll() 方法返回 null
【讨论】:
Remove() 方法与 poll 的不同之处仅在于如果此队列为空,它会引发异常。
【讨论】: