Java 队列 - 为什么要“轮询”和“提供”?

问题描述 投票:0回答:6

好的,我已经使用 Java 很长时间了,最近正在准备 OCJP 考试。我想知道是否有人能够提供任何见解为什么方法名称“poll”(相对于更传统的“pop”)和“offer”(相对于更传统的“push”)被选中?我正在专门研究 java.util.Queue 接口,但也对更一般的解释感兴趣:)

这实际上更像是一个学术问题,而不是任何特定的编码场景,因为我只是想弄清楚为什么 Sun(因为这是在 Oracle 收购它们之前完成的)会选择他们所做的名称。

哦,在任何人决定钉死我或扔回 lmgtfy 的链接之前...我已经在 google、yahoo、wiki、bing 等上查看过,所以如果我忽略了一些明显的搜索条件或错过了这里的一些旧帖子这解释了,那么我提前道歉。

java naming
6个回答
56
投票

因为这些方法在JavaDoc中解释了不同的语义。

add
/
remove
是无条件的,而
offer
/
poll
返回特殊值:

  • offer
    提供一个新值,但可能不被接受,例如如果队列已满

  • poll
    轮询 获取该值,但我们接受该值可能不存在的事实。

让事情变得更加复杂的是,

BlockingQueue
引入了另一对阻止
add
/
remove
的方法。当然,他们可以使用相同的名称和一堆参数/标志,

smellyGet(boolean blocking, boolean failOnEmpty)

但是你不认为这是一个更好的设计吗?

        | Throws ex. | Special v. | Blocks | Times out
--------+------------+------------+--------+---------------------
Insert  | add(e)     | offer(e)   | put(e) | offer(e, time, unit)
Remove  | remove()   | poll()     | take() | poll(time, unit)
Examine | element()  | peek()     | N/A    | N/A

* https://meta.stackexchange.com/questions/73566


11
投票

您混淆了队列和堆栈; push 和 pop 与后者相关。

在适当的生产者/消费者上下文中考虑队列;民意调查和报价将更有意义。


8
投票

Queue 接口定义了一些作用于列表第一个元素的方法,它们的行为方式有所不同。 这些方法是:

peek()
element()
poll()
remove()

偷看() 此方法检索队列第一个元素的值,而不将其从队列中删除。对于该方法的每次调用,我们总是获得相同的值,并且其执行不会影响队列的大小。 如果队列为空,则 peek() 方法返回 null

元素() 此方法的行为类似于 peek(),因此它再次检索第一个元素的值而不删除它。但是,如果列表为空 element() 抛出 NoSuchElementException

民意调查() 此方法通过从队列中删除队列的第一个元素来检索该元素的值。 。每次调用时,它都会删除列表的第一个元素,如果列表已经为空,则返回 null,但不会抛出任何异常

删除() 此方法的行为与 poll() 方法相同,因此它会删除列表的第一个元素,并且 如果列表为空,则会抛出 NoSuchElementException


2
投票

我认为这只是因为

push
pop
的名称在
add
remove
的行为以及
offer
poll
的行为之间听起来含糊不清——尤其是
pop
,让人想起
java.util.Stack.pop()
,其行为类似于
remove
而不是
poll
。显然,选择名称
add
remove
是为了与 Java 集合框架中其他地方的类似方法的名称相匹配,这些方法要么执行请求的操作,要么引发异常;名称
offer
poll
表明它们不会引发异常。


0
投票

所有方法名称都有特定的用例,这可能就是名称的原因

添加()

  • 将指定元素插入队列。如果任务成功,add() 返回 true,否则抛出异常。

报价()

  • 将指定元素插入队列。如果任务成功,offer() 返回 true,否则返回 false。

元素()

  • 返回队列的头部。如果队列为空,则抛出异常。

偷看()

  • 返回队列的头部。如果队列为空,则返回 null。

删除()

  • 返回并删除队列头。如果队列为空,则抛出异常。

民意调查()

  • 返回并删除队列头。如果队列为空,则返回 null。

0
投票

我认为它之所以被称为

poll
,是因为这个词的古义:

切掉树木或植物的顶部,通常是为了促进进一步生长;
“有一些美丽的柳树,现在那个白痴约翰把它们变成了可怜的树桩”

由于通常您在二元上执行轮询操作,因此他们认为使用用于处理实际树的动词可能会很有趣。

正如其他人所说,

offer
操作的命名可能暗示新值可能不被接受,因此您的报价可能会被“拒绝”。

© www.soinside.com 2019 - 2024. All rights reserved.