hashmap底层原理,看这一篇就够了

599 阅读2分钟

引入:

当我们定义一个map.put("1",22)时,hashmap底层是如何进行put的过程

ASCII转换地址:

www.qqxiuzi.cn/bianma/asci…

hash算法:

截图.png

首先通过计算字符串“1” 的hash值为 49, 因为“1”的49,所以hash值为310+49=49 在比如字符串“13”的hash值为1570 3149+51=1570

hashmap原理分析

hashmap底层采用的是数组+链表+红黑树的形式进行存储数据的,那么数据的下标如何确定的呢?put一个key为“1”的字符串在hashmap底层存储的数组下标位置是多少呢?

第一步:

截图.png

通过key的hash值和将hash值进行右移进行异或运算(相同为0 不同为1的原则),我们将key的hashcode值为49转换为32为二进制位

0000 0000 0000 0000 0000 0000 0011 0001

进行右移动16位得到的值位

0000 0000 0000 0000 0000 0000 0000 0000

两个值进行异或计算后得到的值位49

0000 0000 0000 0000 0000 0000 0011 0001

我们可以进行验证一下准确性 通过断点调试发现,key为"1"的hash值为49 ,证明以上是正确的

截图.png

第二步:

确定数组下标的位置是通过hash跟(n-1)进行与运算(两位同时为“1”,结果才为“1”,否则为0的法则)

截图.png

上面的hash值为

0000 0000 0000 0000 0000 0000 0011 0001

我们的容量为16 所以n-1的值为15,二进制表示为

0000 0000 0000 0000 0000 0000 0000 1111

上下两个进行与运算后得到的结果值为1

0000 0000 0000 0000 0000 0000 0000 0001

至此我们找到key为“1”的在hashmap中它是存储在数据下标为1的位置的,我们也可以进行验证这个观点,通过idea调试可以查找出下标为1的值正是我们设置的值

总结:

这里只是简单的入门介绍如何准确的查找数组下标,至于更详细的内容比如扩容,以及数据下标有值如何处理的流程,将会在后续的时间进行更新。希望看过此篇文章的人都能月入百万。