关于 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有相似的性能?
谢谢。
ArrayList
和 ArrayDeque
的增长策略未记录在案,可能在 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
开头并在必要时加倍的大小数组的二次幂,因此 ArrayList
和 ArrayDeque
的内存占用可能不同(对于 ArrayDeque
平均而言,您将拥有更少的重新分配,但浪费的内存更多)。
除非需要重新分配,否则 ArrayList
和 ArrayDeque
添加到尾部的速度大致相同。重新分配事件可能发生在不同的时间点。例如,默认情况下,ArrayList
的第一次重新分配将在添加元素 #11 时发生,但对于 ArrayDeque
,它将发生在元素 #16 上。
ArrayDeque
的优点是能够 add/remove 元素到头部的速度与到尾部的速度一样快。相比之下,ArrayList
将在 O(n)
时间内完成,因为它必须移动所有现有元素。因此,当您需要 add/remove 头部和尾部时,请使用 ArrayDeque
。如果只需要修改尾部,通常首选ArrayList
。
文档说:
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有相似的性能?
谢谢。
ArrayList
和 ArrayDeque
的增长策略未记录在案,可能在 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
开头并在必要时加倍的大小数组的二次幂,因此 ArrayList
和 ArrayDeque
的内存占用可能不同(对于 ArrayDeque
平均而言,您将拥有更少的重新分配,但浪费的内存更多)。
除非需要重新分配,否则 ArrayList
和 ArrayDeque
添加到尾部的速度大致相同。重新分配事件可能发生在不同的时间点。例如,默认情况下,ArrayList
的第一次重新分配将在添加元素 #11 时发生,但对于 ArrayDeque
,它将发生在元素 #16 上。
ArrayDeque
的优点是能够 add/remove 元素到头部的速度与到尾部的速度一样快。相比之下,ArrayList
将在 O(n)
时间内完成,因为它必须移动所有现有元素。因此,当您需要 add/remove 头部和尾部时,请使用 ArrayDeque
。如果只需要修改尾部,通常首选ArrayList
。