HashMap如何实现数组索引的查找?


主要这两个函数
1.
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
2. tab[(n - 1) & hash]

解析:
获取key的散列表,即hash值,显然hash值是int类型,最高32位。如果仅仅通过hash值定位数组的索引,将有10亿的范围。这个范围太大,以至于内存根本放不下。所以必须对它进行处理。

(n - 1) & hash 通过这个表达式就可以处理。数组的长度是2的n次方,这样的好处是(n-1)的二进制表达式变为...000...000111...111,最后几位都是1,这样和hash进行与操作时只会保留hash值最后面几位二进制位,大小在0-(n-1),这刚好就是数组的索引。

这时有同学就会奇怪了,这样不挺好的吗?为啥还有(h = key.hashCode()) ^ (h >>> 16)这个操作?
先说明一下这个操作,把hashCode的低16位和高16位进行异或处理,得到新的hashCode。至于为什么做,百度了解了下,说这是个扰动策略,可以大大降低hashCode的碰撞,所谓碰撞,就是尽量减少索引落在同一个位置,使其均匀分布,那样就可以避免或减少链表的遍历了


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM