最近在看HashMap源码时发现有一个indexFor方法,调用该方法来计算对象应该保存在 table 数组的哪个索引处。
static int indexFor(int h, int length) {
return h & (length-1);
}
我们看到他直接返回了两个参数的与运算,速度更快,因为位运算直接对内存数据进行操作,二进制,不需要转换成十进制操作,注意模数得是2的幂,而hashmap初始容量16符合并且以2的指数扩容,所以hashmap的hash计算效率更高一筹,下面是hashmap的扩容源码:
newThr = odThr << 1 左位移运算,变为原来的两位。
下面是我的测试用例:
测试结果是符合预期的。