在Java中使用基于向量的堆栈实现而不是链表的动机是什么?
在Java中使用基于在Java中使用基于向量的堆栈实现而不是链表的动机是什么?,java,algorithm,data-structures,linked-list,Java,Algorithm,Data Structures,Linked List,在Java中使用基于向量的堆栈实现而不是链表实现的动机是什么?我意识到向量是同步的,具有继承优势(和开销),但我觉得这些数据结构不仅通常在文本中作为基于链表的结构教授,而且在底层数组填充时避免了代价高昂的大小调整 我确实理解,使用摊销分析的向量,即使调整大小也为O(1)。因此,考虑到这一点,这并没有多大区别,但我还是很想理解其基本原理。向量将其数据存储在连续内存中。这有利于缓存 链表在内存中可能会变得非常零碎。链表有以下缺点: 每元素存储开销 从一个元素到另一个元素必须遵循指针/引用的计算复杂
向量的堆栈实现而不是链表实现的动机是什么?我意识到向量
是同步的,具有继承优势(和开销),但我觉得这些数据结构不仅通常在文本中作为基于链表的结构教授,而且在底层数组填充时避免了代价高昂的大小调整
我确实理解,使用摊销分析的向量
,即使调整大小也为O(1)。因此,考虑到这一点,这并没有多大区别,但我还是很想理解其基本原理。向量将其数据存储在连续内存中。这有利于缓存
链表在内存中可能会变得非常零碎。链表有以下缺点:
- 每元素存储开销
- 从一个元素到另一个元素必须遵循指针/引用的计算复杂性
- 错误的缓存位置
当然,这些只是链表的一般缺点;我不知道它们是否影响了Queue
和Stack
基于什么的决策。这与ArrayList相比如何?在其他任何人抱怨之前,Stack和Vector都被认为是不受欢迎的。你应该考虑使用<代码> ARAYLIST/<代码>,如果需要同步,则将ARARYLIST与集合同步。您可以将多个变量存储在一个对象中,并将该对象作为一个条目存储在向量中。@Matt就像您使用ArrayList一样,没有所有的cruft,并且能够将它与collections API一起使用。vector的原始同步技术几乎从来都不是您真正需要的,即使您确实需要某种同步。这就是为什么Vector
即将推出的原因。对于这个特定问题,ArrayDeque
可能是Stack
的现代替代品。第二点不会以任何方式影响堆栈,因为您只需要在一端工作,所以您可以将该端作为头部。对于队列,带有指向最后一个节点的指针的双链接列表可能会起作用,但我不是100%确定。