最近有小伙伴说面试时候经常被问到hashMap的源码,所以今天抽一点时间来简单聊聊。还是我平常的习惯,用最容易理解的大白话来写✍🏻️
hashMap源码分析
hashMap底层是数组+链表+红黑树实现的
其中的Node[]数组里相当于有一个一个的Bucket桶
当往hashMap里存入数据时
首先它会判断这个Node[]数组是不是空的,如果是空的话就初始化扩容
然后根据最后的得到的hash值定位出对应的桶位置具体的定位过程是:首先用key原来的哈希码无符号右移16位得到一个值,再拿这个值^异或上key原来的哈希值,得到一个值,再拿这个值&与上数组长度-1,最后得到一个数,假如数组长度是16,那这个数是一个0-15的一个数。
这里需要注意,面试有可能会问到:&与上数组长度-1的这个操作和%取模是一样的效果,但是&是位运算,%是算术运算,位运算比算术运算效率要高。
最后得到的这个0-15之间的这个数,就是定位到你的key最终落在哪个桶上了
定位到桶以后,接着判断这个桶里是不是空的,如果空,则直接new一个新的Node节点放进去
如果桶不空,则判断将要插入的key和桶中的第一个node的key是否一样,如果一样直接覆盖旧数据;如果不一样,接着判断是否是树节点,如果是树节点就走红黑树的插入逻辑;如果不是树节点,就开始循环遍历插入,一直循环判断看哪个节点的next后继节点为null那就说明这个节点是当前桶里的最后一个节点,那就把新插入的数据,挂到这个节点的后边,当然循环的过程中,如果发现要插入的key和桶里已存在的key有重复的,则跳出循环,直接覆盖旧数据
上边出现了2种覆盖的情况,如果是覆盖的话,只是替换了value值,并没有插入新的元素,所以不需要进行下一步的扩容判断
如果不是覆盖,就执行最后一步:判断是否需要扩容
这里是要求对hashMap的数据结构有一定的了解,如果不了解可以参考我之前的一篇博客,希望能帮助到有需要的小伙伴
https://blog.csdn.net/ju_362204801/article/details/104776452
- 复制链接
- 举报