关于 Java 中 ArrayDeque 的实现

About implementation of ArrayDeque in Java

文档说:

Resizable-array implementation of the Deque interface. Array deques have no capacity restrictions; they grow as necessary to support usage

但是我仍然想了解 ArrayDeque 的结构到底是什么,调整大小是如何工作的。如果有人可以提供可靠的来源,我也可以找到答案,那就太好了。根据我查到的Google的一些结果,它可能是作为一个圆形数组来实现的。是真的吗?增长政策是什么?是不是类似于ArrayList?如果是,ArrayDeque在末尾添加或删除元素等操作是否与ArrayList有相似的性能?

谢谢。

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

ArrayDeque 实现的更改频率低于 ArrayList。默认情况下,它始终在内部使用以 16 开头并在必要时加倍的大小数组的二次幂,因此 ArrayListArrayDeque 的内存占用可能不同(对于 ArrayDeque 平均而言,您将拥有更少的重新分配,但浪费的内存更多)。

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

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