为什么 Stack 是一个类,而 Queue 是一个接口?[已关闭]

2022-09-02 01:53:36

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


答案 1

Stack是一个从 派生而来的后进先出的对象堆栈,也是一个类。 与 Java 最初附带的“旧”集合集一起使用,并最终从 中派生出来。值得注意的是,确实有一个;s 和 s 有许多众所周知的实现,如果选择正确,这些实现可能会对性能产生重大影响。VectorVectorAbstractCollectionStackQueueList

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

Stacks 应该在需要后进先出语义时使用,而 s 应该在需要先进先出语义时使用。Queue

ArrayList并存储事物的有序集合,并且不要与用例或直接对齐。从某种意义上说,s和s是数据的缓冲区,而a的语义通常使它成为数据的存储;没有什么可以阻止您使用 a 来实现 a 或 .LinkedListStackQueueStackQueueListListStackQueue


答案 2

好吧,一个原因是队列的变体可以方便地交换,例如PriorityQueues。它们实现相同的界面,但行为不同。我不认为Stacks有这样的东西,或者至少它没有那么频繁地使用。

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

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