我认为它们非常相似......那么我们什么时候需要使用栈或队列呢?为什么不直接使用ArrayList或LinkedList来替换它们?
我认为它们非常相似......那么我们什么时候需要使用栈或队列呢?为什么不直接使用ArrayList或LinkedList来替换它们?
有一个原因是,队列有一些变体,例如PriorityQueues,可以方便地进行交换。它们具有相同的接口但行为不同。我认为对于堆栈来说没有这样的东西,或者至少没有被经常使用。
仅使用ArrayList无法模拟优先队列。
另外,关于您的第二个问题,当语义上需要使用堆栈或队列时,您应该使用它们。也就是说,如果您正在进行图遍历之类的操作,则明确指定所使用的数据结构非常有帮助。
Stack
是一个后进先出的对象栈,它派生自Vector
类。而Vector
属于Java最初提供的“旧”集合之一,最终派生自AbstractCollection
。需要注意的是,实现Stack
只有一个标准的方法;而对于Queue
和List
,有许多众所周知的实现方法,正确选择可以显著提高性能。
另一方面,Queue
遵循“新”的集合接口Collection
,通常用于今天的代码中,因此它遵循这些接口并带有各种实现。
当您需要LIFO语义时,应该使用Stack
,而当您需要FIFO语义时,应该使用Queue
。
ArrayList
和LinkedList
存储有序的事物集合,并且不直接与Stack
或Queue
的用例相对应。 Stack
和Queue
在某种意义上是数据缓冲区,而List
的语义通常使其成为数据存储器; 没有什么阻止您使用List
来实现Stack
或Queue
。