具有Queue基本功能的最快Java集合是什么?


75

Java中最快的集合是什么?

我只需要添加和删除操作,顺序并不重要,等于元素不是问题,无非就是添加和删除。

没有限制的大小也很重要。

这些集合中将包含对象。

当前,我正在使用ArrayDeque,因为我看到这是更快的Queue实现。


10
如果顺序不重要,则您无需寻找队列。
BoltClock

目前,我正在添加final并从头开始检索(例如Queue),但是如果我可以逐个取出所有元素,则可以使用另一个Collection。
Renato Dinhani 2011年

3
“ ...过早的优化是万恶之源”
mre11年

56
选择正确的集合并不是过早的优化。
博佐

7
BoltClock,这对于Java中的大写Q队列是不正确的。它仅表示“带有头部元素的可变集合”。重新读取java.util.Queue。
凯文·布罗里恩

Answers:


95

ArrayDeque是最好的。请参阅此基准测试该基准测试来自本博客文章,涉及基准测试的结果。ArrayDeque既没有节点分配的开销,LinkedList也没有转移删除的剩余数组内容的开销ArrayList。在基准测试中,它执行约3倍,以及LinkedList大型队列和甚至比略好ArrayList于空队列。为了获得最佳性能,您可能需要给它一个足够大的初始容量,以容纳一次可能要容纳的元素数量,从而避免许多调整大小。

之间ArrayListLinkedList,似乎这取决于平均总要素队列将包含在任何给定的时间和LinkedList节奏ArrayList起价约为10元。


用作堆栈的ArrayList应该与ArrayDeque相同,初始容量会极大地影响性能。太多意味着分配和收集更多的内存,太少则意味着更多的副本(但imo总的来说,对于紧密循环而言,总的来说要好于太大)。我看不到基准的来源,是否可用?
bestsss 2011年

@bestsss:是的,ArrayList尽管ArrayDeque的javadoc建议使用它作为堆栈将大致等效,但它可能会稍快一些。是的,鉴于问题的要求,类似堆栈的用法可以很好地工作。不过,该基准专门针对FIFO队列使用(您可以在链接的博客文章中看到代码示例)。
ColinD 2011年

7
我知道这个问题很旧,但是您的两个链接都已失效。是否有其他网址?
rath 2014年

4
由于与@rath存在相同的问题,因此我检索了原始博客,并找到了原始文章:https ://publicobject.com/2010/07/07/caliper_confirms_reality_linked_list_vs_array_list/ 。不幸的是,如果我尝试查看基准测试结果,则会收到401-未经授权的错误。
ocramot 2015年

3
这也是另一个证实ArrayDeque比LinkedList快3倍的实验:java-performance.info/linkedlist-performance
Dheeru Mundluru

6

您可以使用 java.util.LinkedList-它是双链环和双环,因此加到一端并从另一端取是O(1)

无论您选择哪种实现,都可以通过 Queue接口,以便在事实证明不适合您的情况时轻松地对其进行更改(当然,如果首先需要一个队列)

更新:Colin的答案显示了一个基准,可以得出ArrayDeque更好的结论。两者都具有O(1)操作,但是LinkedList会创建性能稍差的新对象(节点)。由于两者都具有O(1),所以我认为选择它不会太错误LinkedList


2
ArrayDeque虽然客观上更好。
ColinD 2011年

@ColinD-我看到了,但是为什么呢?由于在linekdlist中创建了对象(节点)?两者似乎都是O(1)
博佐

1
@ColinD @Bozho在ArrayDeque中调整数组大小也是如此。这里真正考虑的是算法复杂度。涉及数组的任何事物都是O(N)进行添加/删除,涉及链接的一切事物都是O(1)。
user207421 2011年

16
@EJP:ArrayDeque O(1),用于在前端/后端进行添加和删除(即,用作队列或堆栈时),因为它是一个圆形数组,在这种情况下不会复制任何内容。此外,调整大小是一种偶然的操作,通常可以通过适当的初始容量来避免。LinkedList创建额外对象(以及该对象的垃圾回收)的开销会影响队列中的每个添加/删除。我链接的基准测试表明它的速度始终是的3倍LinkedList
ColinD

1
O(1) != O(1)O()只是衡量复杂性的一种指标,而不是执行时间的指标。无论nO(1),始终需要5年的操作,以及始终需要5 ms的操作也是如此。我宁愿使用需要5毫秒的时间。即使每个元素花费5毫秒的操作(即O(n))也不会比5年的操作更好(如果n操作不会太大)。
Erick G. Hagstrom 2015年

0

ConcurrentLinkedDeque是多线程队列的最佳选择

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.