当前位置: 首页 > news >正文

HashMap中HashCode的实现原理

代码

 static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

1. h >>> 16 是什么,有什么用?
h是hashcode。h >>> 16是用来取出h的高16,(>>>是无符号右移) 如下展示:

0000 0100 1011 0011  1101 1111 1110 0001
>>> 16 
0000 0000 0000 0000  0000 0100 1011 0011

2.为什么 h = key.hashCode()) 与 (h >>> 16) 异或
在分析这个问题之前,我们需要先看看另一个事情, HashMap 如何根据 hash 值找到数组中的对象,我们看看 get 方法的代码:

        if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);

看看代码中注释下方的一行代码:tab[(n - 1) & hash]
使用数组长度减一 与运算 hash 值。这行代码就是为什么要让前面的 hash 方法移位并异或。
我们分析一下:
首先,假设有一种情况,
对象 A 的 hashCode 为 1000010001110001000001111000000,
对象 B 的 hashCode 为 0111011100111000101000010100000。
如果数组长度是16,也就是 15 与运算这两个数, 你会发现结果都是0。这样的散列结果太让人失望了。很明显不是一个好的散列算法。
但是如果我们将 hashCode 值右移 16 位,也就是取 int 类型的一半,刚好将该二进制数对半切开。并且使用位异或运算(如果两个数对应的位置相反,则结果为1,反之为0),这样的话,就能避免我们上面的情况的发生。
目的是为了更加散列

http://www.lryc.cn/news/44303.html

相关文章:

  • Redis —Set、ZSet介绍和应用场景
  • 【产品人卫朋】内容运营:文章点击量少的可怜,该怎么做?
  • 【K8S系列】深入解析无状态服务
  • Node基础--命令窗口
  • 一些有趣的项目
  • 教你精通JavaSE语法之第六章、数组的使用
  • 基于51单片机AT89C51的小型音乐喷泉控制系统设计
  • 【Nacos】Nacos原理详解(注册中心,配置中心)
  • 蓝桥杯刷题冲刺 | 倒计时11天
  • 【新】(2023Q2模拟题JAVA)华为OD机试 - 时间格式化
  • MySQL函数
  • 【Linux系统】开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}
  • 线性代数——行列式
  • Spring注解-Spring-boot-SpingAOP
  • 使用Shell传参解决DataPhin中PySpark不支持中文的问题
  • 【CDH】cloudera manger 如何开启Debug 日志调试模式
  • SQL Server 用户授权与回收
  • 电脑出现乱码的原因以及解决方法
  • 网络工程师笔记
  • linux用户添加用户组与目录切换用户组的操作记录
  • 在CentOS 7上使用二进制文件安装单节点Kubernetes的详细步骤:
  • iCollections for mac 8.0.6.80608 保持Mac桌面的整洁
  • 学习HM微博项目第8天
  • 十五、存储过程与函数
  • php实现助记词转TRX,ETH 私钥和钱包地址
  • 浅析可观测系统中sdk的不同引入方式的利与弊
  • Google Earth导入经纬高(txt文件)
  • Unity客户端开发工程师的进阶之路
  • 2023年全国最新高校辅导员精选真题及答案34
  • chatGPT身份指令