注:本文内容全部基于jdk8讲述。

相信很多人都知道,在JDK8中,HashMap的容量总是2的n次幂,那么这么设计的目的究竟是什么呢?我可不可以将默认的初始容量从16改成20呢,扩容的时候我可不可以将扩容两倍改成扩容3倍或者1.5倍呢?

前期知识准备


什么是 ^

在Java里, ^ 是位运算的一种, 叫做亦或运算。它是针对二进制的一种运算方式,具体的运算规则是:相同的为0,不同的为1。

下面我们来举个

计算2^3的结果。

首先我们将2 和 3 转换为二进制的表现方式,如下:

2 ——> 0010

3 ——> 0011

那么根据上面描述的运算规则,结果就是0001,转换成十进制结果就是1。

怎么样,是不是很好理解。

什么是 &

在Java里, & 也是位运算的一种, 叫做与运算。它是针对二进制的一种运算方式,具体的运算规则是:只要有一个为0,就为0。

下面我们还是来举个

计算2&3的结果。

首先我们将2 和 3 转换为二进制的表现方式,如下:

2 ——> 0010

3 ——> 0011

那么根据上面描述的运算规则,结果就是0010,转换成十进制结果就是2。

什么是 >>>

在Java里, >>> 叫做无符号右移运算。它是针对二进制的一种运算方式,具体的运算规则是:忽略符号位,向右移动n位,空位都以0补齐。

下面我们来举个

计算16>>>2的结果。

首先我们将16 转换为二进制的表现方式,如下:

16 ——> 0001 0000

那么根据上面描述的运算规则,我们需要将这个二进制数右移两位,空位以0补齐,那么下面我用一张图来演示;

如上图所示,红框内是我们需要的结果,第一行为16代表的二级制的原始值,第二行将其右移两位,发现最后两位0移出红框,那么高位就缺两位,我们按照规则,用0将其补齐,得到第三行的数据,那么第三行数据代表的值就是16>>>2的结果,我们将其转化为十进制,结果为4。

所以说16>>>2的结果为4。

那么在Java中,这种类似的位运算还有很多,比如^,&,<>,<<>>等,感兴趣的同学可以自行百度学习。

hash算法


那么接下来进入我们今天的主题,hash算法。首先我们来看一下,hashmap中,hash算法是如何实现的。

hash算法代码

那么,我们将上述代码的关键部分拆解来看,首先我们看一下

h = key.hashCode()

这段代码没有什么特殊的地方,就是求一下key的hash值。

接下来我们看第二段代码,

h >>> 16

这段代码的含义就是将key的hash值右移16位,具体的右移操作我们在上述知识准备中有提到过。

那么整体来看,

(h = key.hashCode()) ^ (h >>> 16)

这段代码含义就是,将key的hash值高16位和低16位进行按位异或的运算,这样可以保证hash值的高低16位都可以参与运算,可以更好的保留hash值每一位数值的特征,从而可以更好的降低hash冲突。

那么为什么采取 ^ 运算,而不是采取 & 或者 | 运算了,这样不是也可以保留高低十六位的特征么?大家可以思考一下,有想法的同学也可以在下方留言。

现在我们知道了HashMap中hash算法的细节,那么文章开头的问题你是否有思路呢,我们将在下一篇文章中进行解答。

传送门:Hashmap中,默认容量为什么是16?

hash算法_阿里面试官:讲一下Hashmap中hash算法!相关推荐

  1. eureka自我保护时间_阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默...

    文章首发:阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默 什么是服务注册? 首先我们来了解下,服务注册.服务发现和服务注册中心的之间的关系. 举个形象的例子,三者之间的关系就好像是供货 ...

  2. 给面试官讲明白:一致性Hash的原理和实践

    戳蓝字"CSDN云计算"关注我们哦! 来源 | 靳刚同学 作者 | 靳刚 "一致性hash的设计初衷是解决分布式缓存问题,它不仅能起到hash作用,还可以在服务器宕机时, ...

  3. xxl子任务_阿里面试官:聊一下分布式任务调度有那些解决方案?

    作者:黄兆平 来源:http://blog.freshfood.cn/article/39 # 简介 随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务 ...

  4. Mysql实现幂等_阿里面试官:接口的幂等性怎么设计?

    大家好,我是狂聊. 自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题. 一.什么是幂等? 看一下维基百科怎么说的: 幂等性:多次调用方法或者接口不会改变业务状 ...

  5. wcf afterreceiverequest获取body数据_阿里面试官的灵魂拷问:究竟如何保证API接口数据安全?...

    前言 前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合.无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用 ...

  6. hashmap put过程_阿里面试官:HashMap数据结构之道

    问题1:HashMap的数据结构是什么样的? 同学1:嗯...数组+链表 同学2:数组+链表... 同学3:数组+链表... 同学4:数组+链表+红黑树... 同学n:..... 为什么答案会有两种? ...

  7. redis setnx 过期时间_阿里面试官:你确定你用过 Redis 分布式锁吗?

    你有听说过 Redlock 吗? 别整些花里胡哨的,Redlock 全称 Redis Distributed Lock,即用 Redis 实现的分布式锁. Redis 热身知识 Redis 命令参考: ...

  8. java 并发 面试题_阿里面试官总结10个经典技术题:Java多线程与并发面试题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 5,有哪些不同的线程生命周期? 当我们在Java程序中新建一个线程时,它的状态是New.当我们调用线程的start()方法时,状态被改变为Runnable ...

  9. 幂等校验是什么意思_阿里面试官:接口的幂等性怎么设计?

    一.什么是幂等? 看一下维基百科怎么说的: 幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致. 二.使用幂等的场景 1.前端重复提交 用户注册,用户创建商品等操 ...

最新文章

  1. f-free 查看系统中空闲和使用的内存
  2. CentOS 5.6下创建KVM虚拟机
  3. 电子白板 矢量 编码_当涉及白板编码采访时,请记住准备
  4. jQuery mobile 中div圆角弹出层
  5. python工程师是什么专业-猎维科技告诉你人工智能工程师与Python工程师有什么区别?...
  6. 【2017年第1期】ISO 8000(大)数据质量标准及应用
  7. 不同数据库模式下DATE类型的行为解析
  8. 红火七月——安全专家齐聚共讨漏洞分析
  9. cf1063A Oh Those Palindromes (贪心)
  10. jar包转换为exe可执行文件
  11. 自回归(Autoregressive Models,AR)模型
  12. mysql数据库密码怎么修改_MySQL数据库密码如何修改?
  13. 用计算机算e的平方为什么显示错误,计算器中出现的E是什么意思?
  14. 局域网内时间同步配置
  15. 2022年6月青少年软件编程(图形化) 等级考试试卷(二级)
  16. 免费搜索引擎登陆入口
  17. 本地文件与服务器同步,本地与服务器文件同步
  18. Qt音视频开发01-共享解码线程(耗时一年/性能凶残/至臻完美)
  19. 全新角度了解百度地图
  20. Windows系统安全风险-本地NTLM重放提权

热门文章

  1. win11WiFi无法连接网络怎么办 Windows11WiFi无法连接网络的解决方法
  2. html余下的高度,html – 使第二行的弹性项目占据容器的剩余高度
  3. ❤️《大前端—了解与使用ES6》
  4. CSS3动画的基本使用(CSS3)
  5. ubuntu复制文件到另一个文件夹_Excel VBA之FSO-2.2文件夹的复制
  6. 打开json文件的工具_Flutter中JSON转Model——在线生成
  7. 使用Visual Studio Code + Node.js搭建TypeScript开发环境
  8. matplotlib——散点图
  9. 向来只用联发科、三星处理器的魅族,怎么就被高通控告了?
  10. xb2xe2 是什么编码 php,python - 这是什么编码,如何解码