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冲突的产生。


相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
28天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
40 3
|
28天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
81 3
|
28天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
57 2
|
28天前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
81 2
|
28天前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
60 2
|
28天前
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
65 2
|
28天前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
111 2
|
18天前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
22 1
|
26天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
42 4