文档说:
Deque 接口的可调整大小的数组实现。数组双端队列没有容量限制;它们根据需要增长以支持使用
但是我仍然想了解 ArrayDeque 的结构到底是什么,调整大小是如何工作的。如果有人可以提供可靠的来源,我可以找到答案,那将是很棒的。根据我发现的一些谷歌结果,它可能实现为一个循环数组。这是真的吗?什么是增长政策?它类似于 ArrayList 吗?如果是,ArrayDeque 在最后添加或删除元素等操作上是否具有与 ArrayList 相似的性能?
谢谢你。
文档说:
Deque 接口的可调整大小的数组实现。数组双端队列没有容量限制;它们根据需要增长以支持使用
但是我仍然想了解 ArrayDeque 的结构到底是什么,调整大小是如何工作的。如果有人可以提供可靠的来源,我可以找到答案,那将是很棒的。根据我发现的一些谷歌结果,它可能实现为一个循环数组。这是真的吗?什么是增长政策?它类似于 ArrayList 吗?如果是,ArrayDeque 在最后添加或删除元素等操作上是否具有与 ArrayList 相似的性能?
谢谢你。
ArrayList
和的增长策略ArrayDeque
没有记录,并且可能在 JDK 实现甚至 JDK 版本之间有所不同。例如,在Open JDK 6中它是(n*3/2+1)
.,但在Open JDK 8中它是(n*3/2)
. 同样在 JDK 6ArrayList
中,默认构造函数最初是使用 10 个元素的数组创建的,而在 JDK 8 中,它仅在添加至少一个元素时才分配一个数组。
实现更改的ArrayDeque
频率低于ArrayList
. 它始终在内部使用大小为 2 的数组,默认情况下从16
默认开始,并在必要时将其加倍,因此内存占用可能会有所不同,ArrayList
并且ArrayDeque
(因为ArrayDeque
平均而言,您将有更少的重新分配,但更多的内存浪费)。
除非需要重新分配ArrayList
,否则添加到尾部的速度大致相同。ArrayDeque
重新分配事件可能发生在不同的点。例如,默认情况下,第一次重新分配 forArrayList
将在添加元素 #11 时发生,但 forArrayDeque
将发生在元素 #16 上。
的优点ArrayDeque
是能够像尾部一样快地向头部添加/删除元素。相反,ArrayList
它将O(n)
及时完成,因为它必须移动所有现有元素。因此ArrayDeque
,当您需要添加/删除头部和尾部时使用。如果您只需要修改尾部,通常ArrayList
是首选。