关于ArrayQue在Java中的实现

关于ArrayQue在Java中的实现,java,arraylist,arraydeque,Java,Arraylist,Arraydeque,文件说: Deque接口的可调整大小的数组实现。数组deques 没有容量限制;它们根据需要增长以支持使用 然而,我仍然想了解ArrayDeque的确切结构,以及调整大小的工作原理。如果有人能提供一个可靠的来源,让我找到答案,那也太好了。根据我发现的一些谷歌搜索结果,它可能被实现为一个圆形数组。这是真的吗?增长政策是什么?它与ArrayList相似吗?如果是,ArrayQue在添加或删除末尾元素等操作中的性能是否与ArrayList类似 谢谢。没有文档记录ArrayList和ArrayDeque

文件说:

Deque接口的可调整大小的数组实现。数组deques 没有容量限制;它们根据需要增长以支持使用

然而,我仍然想了解ArrayDeque的确切结构,以及调整大小的工作原理。如果有人能提供一个可靠的来源,让我找到答案,那也太好了。根据我发现的一些谷歌搜索结果,它可能被实现为一个圆形数组。这是真的吗?增长政策是什么?它与ArrayList相似吗?如果是,ArrayQue在添加或删除末尾元素等操作中的性能是否与ArrayList类似


谢谢。

没有文档记录
ArrayList
ArrayDeque
的增长策略,并且在JDK实现甚至JDK版本之间可能会有所不同。例如,它是
(n*3/2+1)
,但它是
(n*3/2)
。另外,在JDK 6
ArrayList
中,默认构造函数最初是使用10个元素数组创建的,而在JDK 8中,它仅在至少添加一个元素时才分配数组

实现更改的频率低于
ArrayList
。它总是在内部使用两个大小的数组的能力,默认情况下从
16开始,必要时将其加倍,因此
ArrayList
ArrayDeque
的内存占用可能会有所不同(对于
ArrayDeque
,您将平均减少重新分配,但浪费更多内存)

除非需要重新分配,否则对于
ArrayList
ArrayDeque
而言,添加到尾部的速度大致相同。重新分配事件可能发生在不同的点。例如,默认情况下,
ArrayList
的第一次重新分配将在添加元素#11时发生,而
ArrayDeque
的第一次重新分配将在元素#16上发生


ArrayDeque
的优点是能够在头部添加/删除元素的速度与在尾部添加/删除元素的速度一样快。相反,
ArrayList
将在
O(n)
时间内完成,因为它必须移动所有现有元素。因此,当您需要添加/删除头部和尾部时,请使用
ArrayDeque
。如果只需要修改尾部,通常首选
ArrayList

未记录
ArrayList
ArrayDeque
的增长策略,并且可能因JDK实现甚至JDK版本而异。例如,它是
(n*3/2+1)
,但它是
(n*3/2)
。另外,在JDK 6
ArrayList
中,默认构造函数最初是使用10个元素数组创建的,而在JDK 8中,它仅在至少添加一个元素时才分配数组

实现更改的频率低于
ArrayList
。它总是在内部使用两个大小的数组的能力,默认情况下从
16开始,必要时将其加倍,因此
ArrayList
ArrayDeque
的内存占用可能会有所不同(对于
ArrayDeque
,您将平均减少重新分配,但浪费更多内存)

除非需要重新分配,否则对于
ArrayList
ArrayDeque
而言,添加到尾部的速度大致相同。重新分配事件可能发生在不同的点。例如,默认情况下,
ArrayList
的第一次重新分配将在添加元素#11时发生,而
ArrayDeque
的第一次重新分配将在元素#16上发生


ArrayDeque
的优点是能够在头部添加/删除元素的速度与在尾部添加/删除元素的速度一样快。相反,
ArrayList
将在
O(n)
时间内完成,因为它必须移动所有现有元素。因此,当您需要添加/删除头部和尾部时,请使用
ArrayDeque
。如果只需要修改尾部,通常首选
ArrayList

阅读源代码?@chrylis是的,我现在正在做。在我看来,它是一个圆形阵列。当它满时,大小会加倍,这使得grow策略与ArrayList非常相似。我不明白为什么很多人说ArrayDesk比ArrayList快。谁说它快?它们是不同类型的数据结构,而不是替代实现。对于在开始时添加元素,ArrayDeque会更快,因为如果它不需要调整大小,它只会减少头计数器(可能是环绕)。ArrayList将所有元素复制到n+1。但是最后,它们应该非常相似。阅读源代码?@chrylis是的,我现在正在做。在我看来,它是一个圆形阵列。当它满时,大小会加倍,这使得grow策略与ArrayList非常相似。我不明白为什么很多人说ArrayDesk比ArrayList快。谁说它快?它们是不同类型的数据结构,而不是替代实现。对于在开始时添加元素,ArrayDeque会更快,因为如果它不需要调整大小,它只会减少头计数器(可能是环绕)。ArrayList将所有元素复制到n+1。但最后,它们应该非常相似。