博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hashmap的初始容量为什么设置为16?
阅读量:6263 次
发布时间:2019-06-22

本文共 675 字,大约阅读时间需要 2 分钟。

  hot3.png

static int indexFor(int h, int length) { return h & (length-1); }

我们知道对于HashMap的table而言,数据分布需要均匀(最好每项都只有一个元素,这样就可以直接找到),不能太紧也不能太松,太紧会导致查询速度慢,太松则浪费空间。计算hash值后,怎么才能保证table元素分布均与呢?我们会想到取模,但是由于取模的消耗较大,HashMap是这样处理的:调用indexFor方法。

HashMap源码中有一个indexFor方法,返回的是key的hashcode跟初始容量-1做与运算。首先length为2的整数次幂的话,h&(length-1)就相当于对length取模,这样便保证了散列的均匀,同时也提升了效率;其次,length为2的整数次幂的话,为偶数。这样length-1为奇数,奇数的最后一位为1,这样便保证了h&(length-1)的最后一位为0,也可能为1(这取决于h的值),即与后的结果可能为偶数也可能是奇数。这样便可以保证散列的均匀性,

而如果length为奇数的话,很明显length-1为偶数,它的最后一位是0,这样h&(length-1)的最后一位肯定为0,即只能为偶数,这样任何hash值都只会被散列到数组的偶数下标位置上,这便浪费了近一半的空间。所以,length取2的整数次幂,是为了使不同hash值发生碰撞的概率较小,这样就能使元素在哈希表中均匀地散列。

转载于:https://my.oschina.net/134596/blog/1648329

你可能感兴趣的文章
In FontFamilyFont, unable to find attribute android:font的报错处理
查看>>
webpack配置路径问题
查看>>
浅谈尾递归
查看>>
追踪解析 Disruptor 源码
查看>>
CSS-伪类选择器(未完待续。。。)
查看>>
Markdown常用标记使用
查看>>
使用 Docker 部署 Spring Boot项目
查看>>
高清的GIF表情包如何制作
查看>>
mysql-存储过程
查看>>
flac格式转换mp3格式要用什么软件
查看>>
黑客图标
查看>>
JavaScript数据结构与算法——集合
查看>>
DevOps自动化工具集合
查看>>
公共DNS服务器整理
查看>>
Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
查看>>
Alain 菜单权限控制
查看>>
共享本地项目
查看>>
聊聊flink的BlobStoreService
查看>>
275. H-Index II
查看>>
【Leetcode】103. 二叉树的锯齿形层次遍历
查看>>