为什么ArrayDeque比LinkedList的更好为什么ArrayDeque比LinkedLis

2019-05-12 19:52发布

我试图理解为什么Java的ArrayDeque比Java的LinkedList的 ,因为它们都实现deque的界面更好

我几乎看不到在他们的代码中使用ArrayDeque的人。 如果有人揭示更多的光线进入ArrayDeque是如何实现的,这将是有益的。

如果我的理解,我会更有信心使用它。 我无法清楚地了解JDK实现为它管理的头部和尾部引用的方式。

Answer 1:

联结构是可能与每个元素上的高速缓存未命中来迭代最坏结构。 在它的上面,他们消耗的方式更多的内存。

如果您需要添加/两端的去除,ArrayDeque比链表显著更好。 随机存取的每个元素也是一个循环队列O(1)。

链表的只有更好的操作迭代过程中删除当前元素。



Answer 2:

我相信,在主要性能瓶颈LinkedList是,当你推到双端队列的任何终端,幕后实施分配一个新的链表节点,它主要涉及JVM / OS的事实,这是昂贵的。 此外,每当你从任何终端弹出,内部节点LinkedList符合垃圾收集,这就是背后更多的工作。 此外,由于链表节点都在这里和那里分配,CPU缓存的使用不会提供多少好处。

如果可能会感兴趣,我有一个证明,添加元素到ArrayListArrayDeque在固定的时间里运行; 是指这个 。



Answer 3:

ArrayDeque是新的Java 6,这就是为什么大量的代码(特别是尽量与早期的Java版本兼容的项目),不要使用它。

它在某些情况下,因为你没有为每个项目插入分配节点“更好”; 代替所有元素被存储在一个巨大的阵列,如果它得到充分被调整大小。



Answer 4:

所有的人都在批评一个LinkedList ,想想已经利用一切其他人List在Java中可能使用ArrayListLinkedList大多数时间,因为他们一直在Java 6的前后,因为这些都是那些被教导在大多数书籍开始。

但是,这并不意味着,我会盲目服用LinkedList的或ArrayDeque的身边。 如果你想知道的,看看下面的基准由Brian完成 。

测试设置认为:

  • 每个测试对象是500字符串。 每个串在存储器中的不同的对象。
  • 测试阵列的大小将在测试期间被改变。
  • 对于每个阵列大小/队列的实现组合100次运行测试并计算平均时间每次测试。
  • 每个试验包括填充每个队列中的所有对象,然后除去这一切。
  • 测量时间以毫秒为单位。

测试结果:

  • 低于10000元,两者的LinkedList和ArrayDeque测试均在子1 ms级。
  • 随着数据集不断变大,ArrayDeque和LinkedList平均测试时间之间的差异变大。
  • 在9,900,000元的测试规模,LinkedList的方法了比ArrayDeque方法不再〜165%。

图形:

带走:

  • 如果您的要求存储100或200元,就没有太大的使用无论是队列的差异。
  • 但是,如果你是做手机开发,你可能要使用ArrayListArrayDeque与该列表可能需要是因为严格的内存限制最大容量很好的猜测。
  • 大量的代码存在,用书面LinkedList决定使用时如此谨慎行事ArrayDeque特别是因为它没有实现的List界面 (我认为这是原因足够大)。 这可能是你的代码会谈List接口广泛,最有可能,你决定用跳的ArrayDeque 。 使用它的内部实现可能是一个好主意......


Answer 5:

访问在ArrayDeque一个元件总是更快相比链表以O(1),用于访问的元素。 链表中,将需要O(N),找到最后一个元素。

ArrayDeque是记忆效率,因为你没有保持跟踪下一个节点不像链表。

即使按照Java文档,它已被引述

ArrayDeque是双端队列接口的大小可变数组实现。 阵列端队列没有容量限制; 他们成长在必要时支持使用。 他们不是线程安全的; 在不存在外部同步的,它们不支持多个线程的并发访问。 空元素是禁止的。 作为队列使用时,此类很可能是作为燃料电池堆一起使用时比堆栈更快,比链表更快。

标杆这两个证明,ArrayDeque更快。



Answer 6:

虽然ArrayDeque<E>LinkedList<E>已经得到实施Deque<E>接口,但ArrayDeque采用基本上对象数组E[]用于保持它的对象内部的元素,所以它通常使用索引用于定位头部和尾部元件。

总之,它只是工作方式类似的Deque(所有的Deque的方法),但是使用磁盘阵列的数据结构。 至于哪一个更好,取决于你如何以及在何处使用它们。



Answer 7:

时间ArrayDeque复杂用于访问元素是O(1)并且对于链表是为O(N)来访问最后一个元素。 ArrayDeque不是线程安全的人工手动同步是必要的,这样就可以通过多线程访问它,所以他们他们更快。



文章来源: Why is ArrayDeque better than LinkedList