HashMap的寻址算法(源码分析)

ops/2024/11/25 7:14:36/

建议先看完我这篇文章HashMap底层原理-CSDN博客

hashmap插入值的时候,是如何找到数组索引位置的呢?

        例如下图左边四个连续红点,是如何在插入的时候定位到了数组下标为3的位置?

 来看看put方法的源码,里面有个hash(key),这个就是定位数组位置的方法。

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}

我们进去看看

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

        h = key.hashCode()) ^ (h >>> 16),这一步就是我们想要的hash值。

put底层又对这个哈希值做了取模运算,下面看着是与运算,其实就相当于对数组长度取模。

  if ((p = tab[i = (n - 1) & hash]) == null)

        先通过key的hashCode方法获取第一次哈希值,再或上key右移16位,这是二次哈希,右移16位相当于除以2的16次方。得到的值再对数组长度取模,此时算出来的值对应数组下标。这就是HashMap的寻址算法,也叫扰动算法。

        这么做的目的就是让hash值更均匀,减少hash冲突,不信你可以自己生成随机数,让他用这个算法,统计数组上不同位置元素个数,你会发现基本上是均匀分布的。数据均匀分布的好处就是提高查找效率,不至于一堆数据全部集中在数组一个点,查找数据还得走很长的链表或者很高的红黑树,效率都不怎么样。

        

         而且与运算和取模效果一样是有前提的,数组长度必须是2的n次方,不然你就会看到下面的情况,两个算出来的答案不一样。

        提个小问题,你知道为什么上面算数组下标要用与运算而不直接用取余(模)?

        因为效率问题,与运算效率更高,计算机底层只有0和1,与运算更加快捷。
 


http://www.ppmy.cn/ops/136509.html

相关文章

洛谷 B2038:奇偶 ASCII 值判断

【题目来源】https://www.luogu.com.cn/problem/B2038http://shnoip.openjudge.cn/level1/39/【题目描述】 任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO。 例如,字符 A 的 ASCII…

MQ重复消费与消息顺序

如何避免消息重复消费 RocketMQ:给每个消息分配了一个MessageID。这个MessageID就可以作为消费者判断幂等的依据。这种方式不太建议,原因是在高并发场景下这个MessageID不保证全局唯一性。 最好由业务方创建一个与业务相关的全局唯一的ID来区分消息&am…

springboot实战(17)(“大事件“——新增文章主体逻辑)

目录 一、新增文章涉及的数据表、实体类。 (1)表结构。 (2)实体类(Article) 二、接口文档分析。 (1)请求方式与请求路径。 (2)请求参数。 (3&…

RabbitMQ简单应用

概念 RabbitMQ 是一种流行的开源消息代理(Message Broker)软件,它实现了高级消息队列协议(AMQP - Advanced Message Queuing Protocol)。RabbitMQ 通过高效的消息传递机制,主要应用于分布式系统中解耦应用…

Java中的网络基础认知(如果想知道Java中有关网络基础的知识,那么只看这一篇就足够了!)

前言:网络基础是现代通信和信息技术的基石,涉及数据传输、网络协议、路由、交换、网络设备以及网络安全等多个方面,深入了解网络基础,不仅能提升技术能力,还能为更复杂的网络架构与应用打下坚实的基础。 ✨✨✨这里是秋…

【Java 解释器模式】实现高扩展性的医学专家诊断规则引擎

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

Python--类

Python 类练习 最近由于工作需要用到Python写脚本,因此,因此,快速学习一下Python. 如果你学过多种语言, 学习Python就很快了。 推荐菜鸟教程Python 3的教程。Link: https://www.runoob.com/python3/python3-tutorial.html 作为学习&#xf…

周末总结(2024/11/24)

工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利…