java - 为什么 Deque (ArrayDeque) 容量是 2 的幂?
问题描述
在 Java 中(但在 PHP 中类似),ArrayDeque
实现的容量总是 2 的幂:
因为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
可以编写tail = (tail + 1) & (elements.length - 1)
(&
比%
) 更快地工作。ArrayDeque
这种结构在的源代码中多次使用。
推荐阅读
- javascript - React Native - 表单字段验证:无法为密码确认创建密码验证
- ios - 你能有一个后台“应用程序”处理蓝牙输入,并作为一个开关控制输入设备吗?
- java - 使用 Java 进行实时网页抓取
- regex - 使用正则表达式解析 iptables 日志
- c# - 在 Powershell / Winform 中发送键 Ctrl+S
- regex - 在nifi中修剪csv的值
- c# - 以编程方式调用存储在字典中的抽象类的方法?
- active-directory - 未能打开组策略对象。您可能没有适当的权利
- apache-spark - 无法流式传输来自 Kafka Debezium 连接器的 avro 格式数据
- python - 使用 skopt 进行超参数优化后保存 keras 模型时出错