我试图理解为什么Java的ArrayDeque比Java的LinkedList更好,因为它们都实现了Deque接口。

我很少看到有人在代码中使用ArrayDeque。如果有人对ArrayDeque是如何实现的有更多的了解,这将是有帮助的。

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


当前回答

链接结构可能是最糟糕的结构,因为每个元素都有缓存缺失。最重要的是,它们会消耗更多的内存。

如果需要对两端进行添加/删除操作,ArrayDeque明显优于链表。随机访问每个元素也是O(1)循环队列。

链表唯一更好的操作是在迭代过程中删除当前元素。

其他回答

ArrayDeque访问一个元素的时间复杂度为O(1), LinkList访问最后一个元素的时间复杂度为O(N)。ArrayDeque不是线程安全的,所以手动同步是必要的,这样你就可以通过多个线程访问它,这样它们会更快。

ArrayDeque是Java 6的新功能,这就是为什么很多代码(尤其是试图与早期Java版本兼容的项目)不使用它的原因。

在某些情况下,这是“更好的”,因为您没有为每个要插入的项分配一个节点;相反,所有元素都存储在一个巨大的数组中,如果数组满了,就会调整数组的大小。

ArrayDeque和LinkedList都实现了Deque接口,但实现方式不同。

关键的不同点:

ArrayDeque类是Deque接口的可调整大小的数组实现,LinkedList类是列表实现 NULL元素可以添加到LinkedList中,但不能添加到ArrayDeque中 ArrayDeque在两端的添加和删除操作上比LinkedList更有效,LinkedList实现在迭代期间有效地删除当前元素 LinkedList实现比ArrayDeque使用更多的内存

因此,如果你不需要支持NULL元素,并且在两端添加/删除元素时寻找更少的内存和效率,ArrayDeque是最好的

更多细节请参考文档。

链接结构可能是最糟糕的结构,因为每个元素都有缓存缺失。最重要的是,它们会消耗更多的内存。

如果需要对两端进行添加/删除操作,ArrayDeque明显优于链表。随机访问每个元素也是O(1)循环队列。

链表唯一更好的操作是在迭代过程中删除当前元素。

我不认为ArrayDeque比LinkedList好。他们是不同的。

ArrayDeque平均比LinkedList快。但是对于添加一个元素,ArrayDeque需要平摊常数时间,LinkedList也需要常数时间。

对于时间敏感的应用程序,需要所有操作花费常数时间,应该只使用LinkedList。

ArrayDeque的实现使用数组并需要调整大小,有时,当数组已满并且需要添加一个元素时,将花费线性时间来调整大小,从而导致add()方法花费线性时间。如果应用程序对时间非常敏感,这可能是一场灾难。

关于Java实现这两种数据结构的更详细的解释可以在普林斯顿大学在Coursera上提供的“算法,第一部分”课程中找到,该课程由Wayne和Sedgewick教授。该课程对公众免费开放。

详细信息将在“第二周”的“堆栈和队列”部分的视频“调整数组大小”中解释。