堆栈实现Java-LinkedList与Vector

时间:2020-07-26 08:01:04

标签: java stack

我想知道为什么Stack是使用Vector而不是LinkedList实现的。据我所知,LinkedList为元素的删除和插入提供了更有效的结构。因此,为什么使用向量而不是LinkedList实现堆栈。 Java通过LinkedList实现了Queue接口,由于在堆栈和队列中,插入和删除都是主要功能,所以为什么不使用Stacked的链表。

2 个答案:

答案 0 :(得分:5)

StackVector都是旧类。

如果您阅读Stack的Javadoc,则会发现它建议使用Deque代替:

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

LinkedList确实实现了Deque接口。

答案 1 :(得分:4)

据我所知,LinkedList为删除和插入元素提供了更有效的结构。

在堆栈操作的上下文中,这实际上不是真的。 (或一般而言)。

Vector是数组列表的一种形式。它的工作方式是分配一个数组以容纳许多元素,然后使用数组索引访问和更新列表。在Vector中的随机位置插入和删除很昂贵,因为它需要复制多个元素引用。

但是,Stack并不需要。实际上,它需要在Vector的结尾处排他地插入和删除,这很便宜。在大多数情况下,插入和删除仅涉及将元素分配到数组单元中并调整Vector对象的length字段。如果阵列中没有足够的空间,它只会变得昂贵。然后,必须通过创建一个新数组并复制元素来“增长”该数组。但是,当数组列表以指数形式增长数组(例如,通过使其大小增加一倍)时,数学计算表明,在数组列表的整个生命周期内,摊销成本为O(1)

相反,每次,您都将元素插入LinkedList中,这涉及分配一个新的内部“节点”对象来保存该元素。平均而言,这比Vector插入要贵,尤其是考虑到在“节点”对象的生命周期内产生的GC成本时。

假设我们使用的是64位引用,LinkedList的每个元素使用的内存是Vector的4倍。

简而言之,用于堆栈数据结构的VectorLinkedList效率更高,占用的空间更少。做出了正确的设计选择 1


1-正如您所期望的。我们可以假设过去25年来设计和维护Java的工程师知道他们在做什么。否则自从编写该代码以来,成千上万的其他人也会注意到该代码(假设的!)错误并记录了一个错误报告。

相关问题