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