Java HashMap 中为什么扩容需要是2的整数次幂?

Citron__ 2018-07-21 05:39:34
之前在看```HashMap```的源代码和相关博客。
看到了```HashMap```中有关```HashMap```容器大小和```indexFor```中的方法。

1. ```HashMap```为什么长度规定需要是2的n次方。
2. ```HashMap```中```indexFor()```方法中计算```index```是通过位运算(&)来的。

按照我的理解来看,之所以要是2的n次方,是为了能使```indexFor```中的位运算代替取模运算。

> 有些人2^n-1 正好二进制位全是1,类似这种```1111111```,这样与运算```hash```冲突才能降到到最低,但是直接取模不是一样的能均匀分布么?

这里关键的问题就在于究竟是不是位运算比取模运算快很多了:
```
 public static void test2() {
int capacity = 1024;
int val = 13;
int count = 100000;
long t1 = System.nanoTime();
for (int i = 0; i < count; i++) {
indexFor1(val,capacity);
}
long t2 = System.nanoTime();

System.out.println("& time:"+(t2-t1));


long t3 = System.nanoTime();
for (int i = 0; i < count; i++) {
indexFor2(val,capacity);
}
long t4 = System.nanoTime();

System.out.println("% time:"+(t4-t3));


}


static int indexFor1(int h, int length) {
return h & (length-1);
}
static int indexFor2(int h, int length) {
return h % (length);
}

```

这段测试代码在我的电脑上,相差结果并不大。。。

突然就迷惘了。。



楼主之前学过计组,操作系统等学过,也知道取模是肯定比直接位运算慢很多。但是为什么执行起来相差不多。

> 1.难道是因为现在cpu发展已经有了很大的优化,所以相差不打,但是在```HashMap```刚出现的时候,位运算和取模效率相差很大,所以用了位运算,而现在JDK 1.8 还是位运算是为了兼容以前的程序。

是这样么?只是我的猜想,或者是我理解不对?测试方法写的不对?
望解惑,要是是我理解不多,以后这种设计方法可以借鉴啊。
...全文
695 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
相差有多大呢?希望楼主弄明白以后在这里回复一下吧,我也赶到很好奇,按照计算机原理来说,应该差不少才对啊

50,639

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧