问题

我试图了解为什么Java的ArrayDeque比Java的LinkedList更好,他们都实现了Deque接口。

我几乎没有看到有人在他们的代码中使用ArrayDeque。如果有人对ArrayDeque的实现方式有了更多了解,那将会很有帮助。

如果我明白了,我会更自信地使用它。我无法清楚地了解JDK实现它管理头尾引用的方式。


#1 热门回答(102 赞)

链接结构可能是在每个元素上进行高速缓存未命中迭代的最差结构。除此之外,它们消耗更多的内存。

如果需要添加/删除两端,ArrayDeque明显优于链表。随机访问每个元素也是循环队列的O(1)。

链表的唯一更好的操作是在迭代期间删除当前元素。


#2 热门回答(24 赞)

我相信LinkedList的主要性能瓶颈是这样一个事实:每当你推到双端队列的任何一端,在场景后面,实现分配一个新的链表节点,这基本上涉及JVM / OS,而且这很昂贵。此外,无论何时从任何一端弹出,899599508的内部节点都有资格进行垃圾收集,这也是场景背后的更多工作。此外,由于链接列表节点是在这里和那里分配的,因此使用CPU缓存不会带来太多好处。

如果它可能是有意义的,我有一个证明,在摊销的恒定时间内添加元素到ArrayListArrayDequeruns;参考this


#3 热门回答(21 赞)

ArrayDeque是Java 6的新功能,这就是为什么许多代码(特别是试图与早期Java版本兼容的项目)不使用它的原因。

在某些情况下,它"更好",因为你没有为每个要插入的项目分配节点;相反,所有元素都存储在一个巨大的数组中,如果它已满,则会调整大小。


原文链接