HashMap面试系列(1)

Q:HashMap中的Hash码如何计算?为什么要这么做?

注意:HashCode()是对象的Hash码,和HashMap中的Hash码不是同一个东西

1.8版本如下

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

关于位运算
&:两个1是1,其余为0
|:1个1是1,其余为0
^: 同0,异1

h是对象的hashcode,h右移16位也就是取最高位的16位(一共32位)。
与原来的hashcode进行异或运算(同0异1)。
由此可知又移16位和HashCode的^运算,不对hashCode()的高16位进行改变:1&0=1

那么这样做的意义何在???

目的:减少hash碰撞
在jvm虚拟机中,一个hashcode位32,那么右移16位进行打乱的^操作,即是对低16位一次打乱,而且混合后的低位掺杂了高位的部分特征,使高位的信息也被保留下来

1.7版本如下

static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}

功能和1.8版相似

HashMap中的Hash码怎么计算,为什么要这样做?相关推荐

  1. HashMap中的hash算法的几个思考

    HashMap中哈希算法的关键代码 //重新计算哈希值 static final int hash(Object key) {int h;return (key == null) ? 0 : (h = ...

  2. HashMap中的hash与rehash

    HashMap中的hash与rehash 我们知道HashMap中经常用到hash()方法. 比如:put()方法中 public V put(K key, V value){if(key==null ...

  3. HashMap中的hash函数

    在写一个HashSet时候有个需求,是判断HashSet中是否已经存在对象,存在则取出,不存在则add添加.HashSet也是通过HashMap实现,只用了HashMap的key,value都存储一个 ...

  4. Java中的Hash值的计算方式,java哈希算法简单数据类型的具体实现

    最近被提及Java中HashMap的一些实现及哈希冲突等,借鉴了一位老哥的部分解析,比较明白的展示hash算法的应用吧 结论: 对于String.Integer等类复写了Object中的hashCod ...

  5. modbus协议crc校验c语言代码,MODBUS通信协议中CRC校验码的计算(C/C++)实现

    错误检测的方法 错误校验(CRC)域占用两个字节,包含了一个16位的二进制值.CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较 ...

  6. Modbus-RTU通讯协议中CRC校验码的计算步骤及算法代码

    在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1. 预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器 ...

  7. hashmap中的hash扰动函数

    https://www.zhihu.com/question/20733617 转载于:https://www.cnblogs.com/lushilin/p/6142597.html

  8. HashMap 中 hash 冲突的解决方法及原理分析

    我们最先衰老的不是容貌,而是不顾一切的闯劲.有时候,要敢于背上超出自己预料的包袱,真的努力后,你会发现自己要比想象的优秀很多. HashMap冲突的解决方法比较考验一个开发者解决问题的能力. 在Jav ...

  9. hash算法_阿里面试官:讲一下Hashmap中hash算法!

    注:本文内容全部基于jdk8讲述. 相信很多人都知道,在JDK8中,HashMap的容量总是2的n次幂,那么这么设计的目的究竟是什么呢?我可不可以将默认的初始容量从16改成20呢,扩容的时候我可不可以 ...

最新文章

  1. php手册常用的函数
  2. Ubuntu16.04+caffe+digits安装配置
  3. 中心极限定理_High Dimensional Probability(1) 中心极限定理
  4. 智能指针可以放到容器中么_Rust语言入门教程 智能指针篇
  5. C# Base64编码
  6. CIO都在用的数据可视化软件
  7. HRNet的学习笔记
  8. java web sqlmapapi,Sqlmap的sqlmapapi.py简单使用
  9. radius peap mysql_基于Linux Ubuntu的RADIUS服务器搭建
  10. 一线工程师告诉你嵌入式真实现状与发展前景
  11. 工程思维把每件事都当作一个项目来做
  12. 洛阳地铁一号线无人驾驶_无人驾驶超级拖拉机现身洛阳
  13. 通过虚拟机搭建个人NAS
  14. 区块链前景分析和学习建议
  15. Excel 同一单元格显示不同颜色
  16. maya加载不了arnold的mtoa可能是这个低级错误!
  17. Android项目gen目下没有R.class文…
  18. STM32系列之HAL库开发
  19. 跨越40年的甲骨文公司,正在成为年轻一代的时尚选择
  20. 深入理解计算机网络-8网络层5

热门文章

  1. 【运维探讨】RPA落地实践,提升IT运维工作效能!
  2. mysql count的用法_155、MySQL入门(五):SUM and COUNT用法
  3. 理解DCT与DST【三】:离散正弦变换
  4. [置顶] 我奋斗了18年才和你坐在一起喝咖啡
  5. web概念介绍、软件架构、静态资源
  6. Rio手把手教学:如何打造容器化应用程序的一站式部署体验
  7. 2022-2027年中国海洋油气开采行业市场全景评估及发展战略规划报告
  8. 性能优化专题十一--线程优化
  9. 我与《JavaScript高级程序设计》的相爱相杀----JavaScript摘记
  10. iopl和outb函数