【问题标题】:why is Stack a class while Queue is a Interface? [closed]为什么 Stack 是一个类,而 Queue 是一个接口? [关闭]
【发布时间】:2011-10-06 13:45:20
【问题描述】:

我认为它们非常相似...而我们什么时候需要使用堆栈或队列,为什么不直接使用 ArrayList 或 LinkedList 来代替它们呢?

【问题讨论】:

  • 你应该读一本好的数据结构书。简而言之:这些限制可以提高性能并增加理解代码的简单性。
  • 因为 Java 的设计者不擅长 API。栈应该是一个接口,所以可以有不同的栈实现。例如基于数组列表的堆栈和基于链表的堆栈。取而代之的是,他们采用了捷径并将 Vector 子类化来制作某种 franken-stack,该堆栈暴露了其父级的许多不正确的实现细节。他们试图通过创建一个双端队列(即另一个堆栈实现)来纠正这个问题,但只会造成更多的混乱。

标签: java stack queue


【解决方案1】:

嗯,一个原因是队列的变体可以很方便地进行交换,例如 PriorityQueues。它们实现相同的接口,但行为不同。我不认为 Stacks 有类似的东西,或者至少它几乎没有被经常使用。

您无法仅使用 ArrayList 来模拟优先级队列。

此外,关于您的第二个问题,您可能应该使用堆栈或队列,而这正是您语义所使用的。也就是说,如果您正在执行图遍历之类的操作,那么非常明确地说明您正在使用的数据结构类型会有所帮助。

【讨论】:

    【解决方案2】:

    Stack,是从Vector 派生的对象的后进先出堆栈,也是一个类。 Vector 与 Java 最初附带的“旧”集合一起使用,并最终派生自 AbstractCollection。值得注意的是,Stack 确实有一个规范的实现; Queues 和 Lists 有许多众所周知的实现,如果选择正确,它们可以产生巨大的性能差异。

    另一方面,Queue 遵循当今通常使用的“新”集合集合中的Collection 接口,因此它遵循接口并附带各种实现。

    Stacks 应在您需要 LIFO 语义时使用,而Queues 应在您需要先进先出语义时使用。

    ArrayListLinkedList 存储 ordered 集合,不要直接与 StackQueue 的用例对齐。 Stacks 和 Queues 在某种意义上是数据缓冲区,而 List 的语义通常使它成为数据存储;没有什么能阻止您使用List 来实现StackQueue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 2021-11-02
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2010-10-30
      相关资源
      最近更新 更多