我试图理解为什么Java的ArrayDeque比Java的LinkedList的 ,因为它们都实现deque的界面更好 。
我几乎看不到在他们的代码中使用ArrayDeque的人。 如果有人揭示更多的光线进入ArrayDeque是如何实现的,这将是有益的。
如果我的理解,我会更有信心使用它。 我无法清楚地了解JDK实现为它管理的头部和尾部引用的方式。
我试图理解为什么Java的ArrayDeque比Java的LinkedList的 ,因为它们都实现deque的界面更好 。
我几乎看不到在他们的代码中使用ArrayDeque的人。 如果有人揭示更多的光线进入ArrayDeque是如何实现的,这将是有益的。
如果我的理解,我会更有信心使用它。 我无法清楚地了解JDK实现为它管理的头部和尾部引用的方式。
联结构是可能与每个元素上的高速缓存未命中来迭代最坏结构。 在它的上面,他们消耗的方式更多的内存。
如果您需要添加/两端的去除,ArrayDeque比链表显著更好。 随机存取的每个元素也是一个循环队列O(1)。
链表的只有更好的操作迭代过程中删除当前元素。
我相信,在主要性能瓶颈LinkedList
是,当你推到双端队列的任何终端,幕后实施分配一个新的链表节点,它主要涉及JVM / OS的事实,这是昂贵的。 此外,每当你从任何终端弹出,内部节点LinkedList
符合垃圾收集,这就是背后更多的工作。 此外,由于链表节点都在这里和那里分配,CPU缓存的使用不会提供多少好处。
如果可能会感兴趣,我有一个证明,添加元素到ArrayList
或ArrayDeque
在固定的时间里运行; 是指这个 。
ArrayDeque
是新的Java 6,这就是为什么大量的代码(特别是尽量与早期的Java版本兼容的项目),不要使用它。
它在某些情况下,因为你没有为每个项目插入分配节点“更好”; 代替所有元素被存储在一个巨大的阵列,如果它得到充分被调整大小。
所有的人都在批评一个LinkedList
,想想已经利用一切其他人List
在Java中可能使用ArrayList
和LinkedList
大多数时间,因为他们一直在Java 6的前后,因为这些都是那些被教导在大多数书籍开始。
但是,这并不意味着,我会盲目服用LinkedList
的或ArrayDeque
的身边。 如果你想知道的,看看下面的基准由Brian完成 。
测试设置认为:
- 每个测试对象是500字符串。 每个串在存储器中的不同的对象。
- 测试阵列的大小将在测试期间被改变。
- 对于每个阵列大小/队列的实现组合100次运行测试并计算平均时间每次测试。
- 每个试验包括填充每个队列中的所有对象,然后除去这一切。
- 测量时间以毫秒为单位。
测试结果:
- 低于10000元,两者的LinkedList和ArrayDeque测试均在子1 ms级。
- 随着数据集不断变大,ArrayDeque和LinkedList平均测试时间之间的差异变大。
- 在9,900,000元的测试规模,LinkedList的方法了比ArrayDeque方法不再〜165%。
图形:
带走:
ArrayList
或ArrayDeque
与该列表可能需要是因为严格的内存限制最大容量很好的猜测。 LinkedList
决定使用时如此谨慎行事ArrayDeque
特别是因为它没有实现的List
界面 (我认为这是原因足够大)。 这可能是你的代码会谈List接口广泛,最有可能,你决定用跳的ArrayDeque
。 使用它的内部实现可能是一个好主意...... 访问在ArrayDeque一个元件总是更快相比链表以O(1),用于访问的元素。 链表中,将需要O(N),找到最后一个元素。
ArrayDeque是记忆效率,因为你没有保持跟踪下一个节点不像链表。
即使按照Java文档,它已被引述
ArrayDeque是双端队列接口的大小可变数组实现。 阵列端队列没有容量限制; 他们成长在必要时支持使用。 他们不是线程安全的; 在不存在外部同步的,它们不支持多个线程的并发访问。 空元素是禁止的。 作为队列使用时,此类很可能是作为燃料电池堆一起使用时比堆栈更快,比链表更快。
标杆这两个证明,ArrayDeque更快。
虽然ArrayDeque<E>
和LinkedList<E>
已经得到实施Deque<E>
接口,但ArrayDeque采用基本上对象数组E[]
用于保持它的对象内部的元素,所以它通常使用索引用于定位头部和尾部元件。
总之,它只是工作方式类似的Deque(所有的Deque的方法),但是使用磁盘阵列的数据结构。 至于哪一个更好,取决于你如何以及在何处使用它们。
时间ArrayDeque复杂用于访问元素是O(1)并且对于链表是为O(N)来访问最后一个元素。 ArrayDeque不是线程安全的人工手动同步是必要的,这样就可以通过多线程访问它,所以他们他们更快。