20

根据javadoc,

当用作堆栈时,ArrayDeque 类可能比 Stack 更快

我不明白 ArrayDeque 怎么能比堆栈快。假设栈使用链表实现如下:

Push: Insert new element at the head, teamp->next = head; head = temp 
(where temp is the element to be inserted)
Pop: Remove the element from head, and make head = head->next

对于大量元素,ArrayDeque 会产生调整大小的开销,这在使用 LinkedList 实现的 Stack 中不会出现这种情况。那么 ArrayDeque 到底比栈快多少呢?

4

6 回答 6

28

ArrayDeque 是 Java Collections Framework 的一部分,并不是为了本质上是线程安全的。

Stack 与 Vector 和 Hashtable 一起出现在 Java 1.0 中,并通过线程安全操作实现(因为当时这似乎是个好主意)。获取和释放线程锁在时间方面相对昂贵,因此这些数据结构将比它们在 JCF 中的同胞慢得多。

于 2014-05-28T10:07:26.780 回答
8

因为大多数操作不需要调整数组大小,特别是当队列达到稳定大小并且不再增长时。

每次添加项目时Stack都必须分配新对象更新链接等。

ArrayDeque只需要将对象放入数组并更新索引。

于 2014-05-28T10:03:32.587 回答
2

以我的经验,仅在一种情况下,链表比数组列表更有效——您经常希望在单次遍历列表中的随机点中添加或删除多个元素。在其他所有情况下,数组列表通常更好 - 更快的查找、随机访问、更少的内存。如果 ArrayDeque 基于数组 - 它可能不需要为存储在其中的每个项目分配额外的节点对象。

由于堆栈通常在列表末尾添加/删除项目,因此基于数组的解决方案可能更有效

于 2014-05-28T10:04:26.870 回答
1

There are multiple reasons to use ArrayDeque instead of Stack as ArrayDeque is a Doubly ended Queue implemented as an Array. So, it can grow relatively faster. If you do not plan to use syncronized stack, then ArrayDeque is probably better than Stack which is Thread safe(and hence slow). ArrayDeque has better locality of reference as well.

于 2019-09-13T08:14:48.003 回答
0

关键词是“可能”。如果确实发生了调整大小,那么它可能会变慢,但堆栈不太可能增长那么多。

于 2014-05-28T10:03:41.707 回答
0

只要您所做的主要操作不是“包含”搜索或“批量插入”等,与其他数据结构相比,数组的工作速度会更快。“更快”部分始终取决于使用情况。平均而言,即如果您采用平均时间,ArrayDeque 将比 Stack 快。

于 2014-05-28T10:07:27.903 回答