我试图理解为什么Java的ArrayDeque比Java的LinkedList更好,因为它们都实现了Deque接口。
我很少看到有人在代码中使用ArrayDeque。如果有人对ArrayDeque是如何实现的有更多的了解,这将是有帮助的。
如果我理解了它,我就会更有信心使用它。我不能清楚地理解JDK实现管理头部和尾部引用的方式。
我试图理解为什么Java的ArrayDeque比Java的LinkedList更好,因为它们都实现了Deque接口。
我很少看到有人在代码中使用ArrayDeque。如果有人对ArrayDeque是如何实现的有更多的了解,这将是有帮助的。
如果我理解了它,我就会更有信心使用它。我不能清楚地理解JDK实现管理头部和尾部引用的方式。
当前回答
I believe that the main performance bottleneck in LinkedList is the fact that whenever you push to any end of the deque, behind the scene the implementation allocates a new linked list node, which essentially involves JVM/OS, and that's expensive. Also, whenever you pop from any end, the internal nodes of LinkedList become eligible for garbage collection and that's more work behind the scene. Also, since the linked list nodes are allocated here and there, usage of CPU cache won't provide much benefit.
如果它可能是感兴趣的,我有一个证明,添加(追加)一个元素到ArrayList或ArrayDeque运行平摊常数时间;参考这个。
其他回答
ArrayDeque和LinkedList都实现了Deque接口,但实现方式不同。
关键的不同点:
ArrayDeque类是Deque接口的可调整大小的数组实现,LinkedList类是列表实现 NULL元素可以添加到LinkedList中,但不能添加到ArrayDeque中 ArrayDeque在两端的添加和删除操作上比LinkedList更有效,LinkedList实现在迭代期间有效地删除当前元素 LinkedList实现比ArrayDeque使用更多的内存
因此,如果你不需要支持NULL元素,并且在两端添加/删除元素时寻找更少的内存和效率,ArrayDeque是最好的
更多细节请参考文档。
ArrayDeque是Java 6的新功能,这就是为什么很多代码(尤其是试图与早期Java版本兼容的项目)不使用它的原因。
在某些情况下,这是“更好的”,因为您没有为每个要插入的项分配一个节点;相反,所有元素都存储在一个巨大的数组中,如果数组满了,就会调整数组的大小。
ArrayDeque访问一个元素的时间复杂度为O(1), LinkList访问最后一个元素的时间复杂度为O(N)。ArrayDeque不是线程安全的,所以手动同步是必要的,这样你就可以通过多个线程访问它,这样它们会更快。
I believe that the main performance bottleneck in LinkedList is the fact that whenever you push to any end of the deque, behind the scene the implementation allocates a new linked list node, which essentially involves JVM/OS, and that's expensive. Also, whenever you pop from any end, the internal nodes of LinkedList become eligible for garbage collection and that's more work behind the scene. Also, since the linked list nodes are allocated here and there, usage of CPU cache won't provide much benefit.
如果它可能是感兴趣的,我有一个证明,添加(追加)一个元素到ArrayList或ArrayDeque运行平摊常数时间;参考这个。
虽然ArrayDeque<E>和LinkedList<E>都实现了Deque<E>接口,但是ArrayDeque基本上使用对象数组E[]来保持其对象中的元素,因此它通常使用索引来定位头部和尾部元素。
总之,它就像Deque一样工作(使用所有Deque的方法),但是使用数组的数据结构。至于哪一个更好,取决于你如何和在哪里使用它们。