网站救助计划
1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本
2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助,网站倒闭后可联系站长领取本站pdf内容
3.若网站能存活下来,后续将会持续更新内容
哈希冲突:hashMap
在存储元素时会先计算key
的hash值来确定存储位置,因为key
的hash值计算最后有个对数组长度取余的操作,所以即使不同的key
也可能计算出相同的hash值,这样就引起了hash冲突。hashMap
的底层结构中的链表/红黑树就是用来解决这个问题的。
HashMap
中的哈希冲突解决方式可以主要从三方面考虑(以JDK1.8为背景)
- 拉链法
HasMap
中的数据结构为数组+链表/红黑树,当不同的key
计算出的hash值相同时,就用链表的形式将Node结点(冲突的key
及key
对应的value
)挂在数组后面。 - hash函数
key
的hash值经过两次扰动,key
的hashCode
值与key
的hashCode
值的右移16位进行异或,然后对数组的长度取余(实际为了提高性能用的是位运算,但目的和取余一样),这样做可以让hashCode
取值出的高位也参与运算,进一步降低hash冲突的概率,使得数据分布更平均。 - 红黑树在拉链法中,如果hash冲突特别严重,则会导致数组上挂的链表长度过长,性能变差,因此在链表长度大于8时,将链表转化为红黑树,可以提高遍历链表的速度。
本站链接:https://www.mianshi.online,如需勘误或投稿,请联系微信:lurenzhang888
点击面试手册,获取本站面试手册PDF完整版