为什么Stack是一个类而Queue是一个接口?

22

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


1
你应该阅读一本好的数据结构书籍。简而言之:限制可以提高性能并增加理解代码的简单性。 - Merlyn Morgan-Graham
4
因为Java的设计者在API方面做得不好。Stack应该是一个接口,这样就可以有不同的堆栈实现。例如,基于数组列表和基于链表的堆栈。相反,他们采取了一种捷径,通过子类化Vector来创建某种“弗兰肯斯坦式”的堆栈,暴露了其父类的许多错误实现细节。他们试图通过创建一个Deque(即另一个堆栈实现)来纠正这一点,但只是造成了更多的混乱。 - Evan Plaice
2个回答

7

有一个原因是,队列有一些变体,例如PriorityQueues,可以方便地进行交换。它们具有相同的接口但行为不同。我认为对于堆栈来说没有这样的东西,或者至少没有被经常使用。

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

另外,关于您的第二个问题,当语义上需要使用堆栈或队列时,您应该使用它们。也就是说,如果您正在进行图遍历之类的操作,则明确指定所使用的数据结构非常有帮助。


7

Stack是一个后进先出的对象栈,它派生自Vector类。而Vector属于Java最初提供的“旧”集合之一,最终派生自AbstractCollection。需要注意的是,实现Stack只有一个标准的方法;而对于QueueList,有许多众所周知的实现方法,正确选择可以显著提高性能。

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

当您需要LIFO语义时,应该使用Stack,而当您需要FIFO语义时,应该使用Queue

ArrayListLinkedList存储有序的事物集合,并且不直接与StackQueue的用例相对应。 StackQueue在某种意义上是数据缓冲区,而List的语义通常使其成为数据存储器; 没有什么阻止您使用List来实现StackQueue


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接