有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

命名Java队列为什么是“轮询”和“提供”?

好的,我已经使用Java很长时间了,最近一直在准备我的OCJP考试。我想知道是否有人能够提供一些关于为什么选择“poll”(相对于传统的“pop”)和“offer”(相对于传统的“push”)的方法名称的见解?我特别关注java。util。队列接口,但对更一般的解释也感兴趣:)

这实际上是一个学术问题,而不是任何特定的编码方案,因为我只是想弄清楚为什么Sun(在Oracle收购它们之前就是这么做的)会选择它们的名字

哦,在有人决定把我钉十字架或者把链接扔回lmgtfy之前。。。我已经看过谷歌、雅虎、维基、必应等等,如果我忽略了一些明显的搜索标准,或者错过了一些解释它的老帖子,那么我提前道歉


共 (4) 个答案

  1. # 1 楼答案

    你把队列和堆栈搞混了;推送和弹出与后者相关联

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

  2. # 2 楼答案

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

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

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

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

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

    删除() 此方法的行为类似于poll()方法,因此它会删除列表的第一个元素,如果列表为空,则会抛出NoTouchElementException

  3. # 3 楼答案

    因为这些方法在JavaDoc中解释了不同的语义add/remove是无条件的,而offer/poll返回特殊值

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

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

    更复杂的是,^{}引入了另一对阻塞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

  4. # 4 楼答案

    我认为这仅仅是因为名字{}和{}听起来在{}和{}的行为与{}和{}和{}的行为之间模棱两可,特别是让人想起{},它的行为类似{},而不是类似{}。显然,选择名称addremove是为了匹配Java集合框架中其他类似方法的名称,这些方法要么执行请求的操作,要么引发异常;名称offerpoll表明它们不会引发异常