java - 为什么 HashMap(和其他类)的 OpenJDK 实现中的值使用位移进行初始化?
问题描述
我正在查看 OpenJDK 的HashMap 实现,偶然发现了这行代码,其中设置了默认初始容量:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
为什么在这里使用位移而不是仅仅DEFAULT_INITIAL_CAPACITY
用初始化16
?我已经查看了其他类,例如Arrays,并且在那里,一个值也是用位移位初始化的:
private static final int MIN_ARRAY_SORT_GRAN = 1 << 13;
对于使用这些实现的人来说,知道值是哪个二进制数而不是十进制表示,这是传统的事情还是更重要?
解决方案
因为有时用位数而不是数字范围更容易推理。但是,在 的情况下HashMap
,另一个原因是您需要做hash % numberOfBuckets
,模运算很昂贵,因此可以使用 2 的幂,然后可以用逻辑 AND 替换模运算 - 它会做同样的事情,但这种方式仅适用于二的幂。这种Arrays
情况——可能是类似的原因。
推荐阅读
- python - 绘制机器学习的校准曲线
- javascript - 带有通知器的 RxJS `repeatWhen` 快速重复
- python - 如何在 Python 中通过 xPath 使用 XML 的前一个兄弟姐妹?
- python - Python过滤带有条件的重复行
- c++ - C++17 制作函数返回类型模板,然后为支持的类型编写实现
- docker - JsReport 将环境变量加载到资源中
- python - 从 txt 打开保存数据,其中 dict 和更新并再次保存
- python - AttributeError:“Python”对象没有属性“控制”
- flutter - 类参数设置中的多if语句
- c# - 如果下载完成,则从 form1 关闭 form5