Java Map的Hash算法究竟干了什么?

简介: Java Map的Hash算法究竟干了什么?

首先说下hashmap的实现基本逻辑


1.根据key值算出hashcode

2.用hash算法转换第一步的hashcode,得hash值

3.将第二步的hash值对内部数组长度进行取模,得到落点p

44.把value放入这个格子


从这些步骤可以看出,hash算法好不好直接决定了落点能否均匀分布。

hashMap是键值对的集合,比如key=“Hello”,value=“Hello”。

这个Hello拥有自己的hashCode,用如下代码可以看出来。


String key = "Hello";


System.out.println(key.hashCode());


hashCode对应10进制为69609650,二进制为100001001100010100010110010。

hashmap内部维护了一个数组,默认长度为16,当你存入一个键值对,就需要把key换算成这个数组的下标,再把value存进去。

也就是说,你得把 100001001100010100010110010 这个玩意变成 0-15之间的一个数字。

Jdk的做法就是取模,取模是计算机的说法,数学的讲法就是取余数。

所以,你可以直接这么写:


String key = "Hello";int hashCode = key.hashCode();int index = hashCode % 16;


System.out.println(index);


没问题,得到数字2,这就是最终的落点p。

取模操作有个装逼写法,据说效率更高:


int index = hashCode & (16-1);


别问为什么,问就是jdk源码就这么写的,俺也不知道,也不敢问。


a%b=a&(b-1)   b为2的整次幂


15的二进制是1110,按位与就变成了


1e88678b2ece445fbb7cfc0a776e49d1.png

最终得到的就是0010,根据1248大法,立刻能口算出就是2(10进制)。

但是呢,这种hash算法是不太好的,我们直接取了hashCode,可以说没有算法在里面。

看下jdk1.8是怎么做的?


public static int hash(int a) {


   return a ^ (a >>> 16);


}


哦,原来是先把hashCode右移16位,让高位移到低位,再和原来的异或一下。这样低位区也有高位区的特征。


100001001100010100010110010 -> 00000000000000001000010011


7bf2606a1f8e4517a2803e247c146fff.png


最终得到的结果是4,就不一样了。


总结:hash算法的目的就是让hashCode换算之后能够均匀分布在数组中,减少Hash冲突的产生。


相关文章
|
17小时前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
10天前
|
Java
java Map删除值为null的元素
java Map删除值为null的元素
|
10天前
|
Java fastjson
Java将Map转换为实体类
Java将Map转换为实体类
|
10天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
25 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
16天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
16天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
16天前
|
存储 算法 Java
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
30 0
|
17天前
|
搜索推荐 算法 Java
Java实现的常用八种排序算法
提到数据结构与算法,无法避免的一点就包含排序,熟练的掌握各种排序算法则是一个程序员必备的素质之一,除此之外,排序算法也是当下各大技术公司比较喜欢问的技术点,所以,就这一点JavaBuild整理了常见的8种排序算法
6 0
|
21天前
|
机器学习/深度学习 数据采集 算法
使用 Java 实现机器学习算法
【4月更文挑战第19天】Java在数据驱动时代为机器学习提供支持,具备丰富的数学和数据结构库,适用于实现线性回归、决策树、SVM和随机森林等算法。实现时注意数据预处理、模型选择、评估指标和可视化。利用Java的库和编程能力可构建高效模型,但需按问题需求选择合适技术和优化方法。
|
28天前
|
存储 算法 安全
Java Map:键值对的奇妙之旅
Java Map:键值对的奇妙之旅
43 0
Java Map:键值对的奇妙之旅