Java中最快的集合是什么?
我只需要添加和删除操作,顺序并不重要,等于元素不是问题,无非就是添加和删除。
没有限制的大小也很重要。
这些集合中将包含对象。
当前,我正在使用ArrayDeque,因为我看到这是更快的Queue实现。
Java中最快的集合是什么?
我只需要添加和删除操作,顺序并不重要,等于元素不是问题,无非就是添加和删除。
没有限制的大小也很重要。
这些集合中将包含对象。
当前,我正在使用ArrayDeque,因为我看到这是更快的Queue实现。
Answers:
ArrayList
尽管ArrayDeque
的javadoc建议使用它作为堆栈将大致等效,但它可能会稍快一些。是的,鉴于问题的要求,类似堆栈的用法可以很好地工作。不过,该基准专门针对FIFO队列使用(您可以在链接的博客文章中看到代码示例)。
您可以使用 java.util.LinkedList
-它是双链环和双环,因此加到一端并从另一端取是O(1)
无论您选择哪种实现,都可以通过 Queue
接口,以便在事实证明不适合您的情况时轻松地对其进行更改(当然,如果首先需要一个队列)
更新:Colin的答案显示了一个基准,可以得出ArrayDeque
更好的结论。两者都具有O(1)操作,但是LinkedList
会创建性能稍差的新对象(节点)。由于两者都具有O(1),所以我认为选择它不会太错误LinkedList
。
ArrayDeque
虽然客观上更好。
ArrayDeque
是O(1),用于在前端/后端进行添加和删除(即,用作队列或堆栈时),因为它是一个圆形数组,在这种情况下不会复制任何内容。此外,调整大小是一种偶然的操作,通常可以通过适当的初始容量来避免。LinkedList
创建额外对象(以及该对象的垃圾回收)的开销会影响队列中的每个添加/删除。我链接的基准测试表明它的速度始终是的3倍LinkedList
。
O(1) != O(1)
。O()
只是衡量复杂性的一种指标,而不是执行时间的指标。无论n
是O(1)
,始终需要5年的操作,以及始终需要5 ms的操作也是如此。我宁愿使用需要5毫秒的时间。即使每个元素花费5毫秒的操作(即O(n)
)也不会比5年的操作更好(如果n
操作不会太大)。