【问题标题】:The reason for different implementation of Stack and Queue in Java?Java中Stack和Queue实现不同的原因?
【发布时间】:2019-01-23 21:27:06
【问题描述】:

堆栈已在 Java 中使用可调整大小的数组(向量)实现。但是,据我了解,尽管您可以选择,但对于常见应用程序,队列通常使用 LinkedList 进行实例化。

我知道理论上它们支持 O(1) 最坏情况或摊销的所有操作。但是,可调整大小的数组更适合堆栈,而链表更适合队列,是否有特定的原因?

换句话说,为什么它们不都使用可调整大小的数组或链表呢?

【问题讨论】:

  • 另见stackoverflow.com/questions/322715/…。我看到的常见建议是几乎没有理由使用链表,但有些人反对。 (在其他人的争论中,他们的理由与渐近分析无关,也不特定于列表。)

标签: java data-structures stack queue time-complexity


【解决方案1】:

我知道理论上它们支持 O(1) 最坏情况或摊销的所有操作。

您似乎弄错了,因为Stack#searchO(n) 操作。

...而链表更适合队列?

LinkedList 在用作Queue 时不太可能是最佳的,正如ArrayDequedocumentation 所解释的那样:

[ArrayDeque] 作为栈使用时可能比 Stack 快,作为队列使用时比 LinkedList 快。


换句话说,为什么它们不都使用可调整大小的数组或链表呢?

因为Stack 是一个不应该使用的过时类,由其documentation 指定:

Deque 接口及其实现提供了一组更完整和一致的 LIFO 堆栈操作,应优先使用该类。

【讨论】:

  • “[N]不适合”似乎有点太强了。我可能会购买“不是最佳的”。
  • @JohnBollinger 同意。
【解决方案2】:

堆栈之所以这样称呼,是因为它们是“堆栈”。一个对象超过另一个对象。对这些堆叠对象的迭代需要很丰富,堆栈通常是为了快速读取和写入而构建的。 ArrayLists(或可调整大小的数组)使用单个动态数组来存储数据。向数组添加新内容并不是最快的事情,但因为它是单个数组,所以读写速度更好。

队列只是一个接一个地排队的数据字符串。无论如何,队列通常会不断增长。想想音乐队列,歌曲被多次添加。然而,音乐的阅读是非常基本的,所以阅读和写作不需要花费太多时间。 LinkedLists 使用双链表运行,这允许更快的添加/删除时间,但更慢的读写时间。

希望这能回答您的问题。 干杯!

【讨论】:

  • “当这些堆叠对象一起存储在内存中时,迭代这些对象的速度会更快,这就是为什么使用可调整大小的数组有好处的原因。” - Java 的堆内存没有义务是连续的。
  • @JacobG。感谢您的指点,我的思绪开始在 C 中运行一秒钟。我的坏
猜你喜欢
  • 2012-03-11
  • 2016-01-06
  • 2017-05-10
  • 2015-06-16
  • 2011-03-01
  • 2011-06-14
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多