java - 为什么双端队列(ArrayDeque)容量是2的幂?

标签 java deque capacity arraydeque

在 Java 中(但在 PHP 中类似)ArrayDeque 实现始终具有 2 的幂:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/ArrayDeque.java#l126

对于HashMap,这个选择很明确——基于修剪后的 32 位散列具有统一的元素分布。但是 Deque 按顺序插入/删除元素。

此外,ArrayList 不将其容量限制为 2 的幂,只是确保它至少是元素的数量。

那么,为什么 Deque 实现要求它的容量是 2 的幂

最佳答案

我想,出于性能原因。例如,让我们看一下 addLast 函数的实现:

public void addLast(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[tail] = e;
    if ( (tail = (tail + 1) & (elements.length - 1)) == head)
        doubleCapacity();
}

因此,可以编写 tail = (tail + 1) & (elements.length - 1) 而不是 tail = (tail + 1) % elements.length code>(&% 工作得更快)。此类构造在 ArrayDeque 的源代码中多次使用。

关于java - 为什么双端队列(ArrayDeque)容量是2的幂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56779739/

相关文章:

java - Eclipse 与 Jenkins 中的 TestNG 继承行为

java - JDBC SQL Server 数据库迁移

java - 我所有的 Web 服务方法都暴露了,无论@WebMethod如何

python - 如何最有效地使用 collections.deque(popleft 与 appendleft)

c++ - 长时间运行的 C++ 应用程序中的内存泄漏

Java 数组 : Unexpected behavior regarding size?

c# - 已知分布的最佳列表容量

java - JAVA中如何将字符串转换为对象

ios - 为什么数组没有显示在 TableView 中?

c - C 中的动态数组函数 - 设置容量并创建更大的数组