关于在Java

时间:2015-07-13 04:10:06

标签: java arraylist arraydeque

文档说:

  

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

但是我仍然想了解ArrayDeque的确切结构是什么,调整大小是如何工作的。如果有人可以提供可靠的来源,我可以找到答案,这将是很好的。根据我发现的一些谷歌搜索结果,它可能是一个圆形阵列。这是真的吗?什么是增长政策?它与ArrayList类似吗?如果是,ArrayDeque在操作中是否具有与ArrayList类似的性能,如在末尾添加或删除元素?

谢谢。

1 个答案:

答案 0 :(得分:6)

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

ArrayDeque实施的变化频率低于ArrayList。它始终在内部使用两倍大小的数组,默认情况下以16开头,并在必要时加倍,因此ArrayListArrayDeque的内存占用量可能不同({{1}平均减少重新分配,但内存浪费更多。

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

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