【问题标题】:In Java, why is it that a Stack is a concrete class whereas the Queue is an interface?在 Java 中,为什么 Stack 是一个具体的类,而 Queue 是一个接口?
【发布时间】:2011-04-04 02:36:22
【问题描述】:

Queue 的哪个子类是“普通”队列?

【问题讨论】:

    标签: stack queue


    【解决方案1】:

    (1) java.util.Stack 是 Java 1.0 的遗留类。它比 Collections 框架早了很多年,坦率地说,它是许多方面可怕设计的一个例子。没有什么是事情应该是这样的。主要问题是Stack扩展了Vector,并且由于Java中的所有继承都是公共继承,Vector的所有方法在Stack上也可用。因此,您可以检查堆栈中的任何位置,从中间添加和删除元素,清除它,或执行任何数量的其他不应该是堆栈抽象的一部分的事情,没有强制转换。与使用QueueDeque 接口相比,只有适合堆栈的方法可用。

    (2) 确实没有普通的队列这种东西,但是 LinkedList 实现了 Queue 没有任何特殊的语义,所以也许这就是你想要的。

    【讨论】:

    • 你能解释一下为什么java.util.Stack 是一个可怕的设计吗? ...尤其是在为什么 java.util.Queue 设计良好的背景下?
    • @ExplosionPills 添加了一些解释。
    【解决方案2】:

    它的任何具体子类都可以用作“普通”队列。诚然,它们可能具有附加功能,但您可以只使用在Queue 接口中声明的方法。虽然我想如果你想要一个“普通”的子类,你可能想要避免额外功能影响队列排序(如PriorityQueue)、容量等的子类。

    【讨论】:

    • 除了许多子类做的事情远非平淡无奇。例如,SynchronousQueue 的内部容量为零。
    猜你喜欢
    • 2011-10-06
    • 2015-08-02
    • 2017-01-14
    • 2021-11-02
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    相关资源
    最近更新 更多