首页 > 解决方案 > 为什么 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;

对于使用这些实现的人来说,知道值是哪个二进制数而不是十进制表示,这是传统的事情还是更重要?

标签: java

解决方案


因为有时用位数而不是数字范围更容易推理。但是,在 的情况下HashMap,另一个原因是您需要做hash % numberOfBuckets,模运算很昂贵,因此可以使用 2 的幂,然后可以用逻辑 AND 替换模运算 - 它会做同样的事情,但这种方式仅适用于二的幂。这种Arrays情况——可能是类似的原因。


推荐阅读