【面试题】JDK1.8中对hash算法和寻址算法是如何优化的?

JDK1.8对HashMap的hash算法进行了优化,通过将key的hash值右移16位并与原始hash值进行异或操作,降低冲突概率。寻址算法优化使用(n-1)&hash替代取模运算,提高性能。当数组长度为2的n次方时,两者效果一致,但与运算更快。文章探讨了这些优化的核心原理及其意义。
  • hash算法优化

JDK1.8中源码如下:

static final int hash(Object key){

    int h;

    return (key == null)?0:(h == key.hashCode())^(h>>>16);

}

hashcodeyou右移16位并做异或操作

异或:相同为0,不同为1

假设有哦个key的hash值如下

【原hash值】1111 1111 1111 1111 1111 1010 0111 1100

【右移16位】0000 0000 0000 0000 1111 1111 1111 1111

【异或之后】1111 1111 1111 1111 0000 0101 1000 0011

可见高16位不变,用远hash值的高16位与低16位进行异或操作

hash算法优化处理的核心及意义:对每个hash值,在他的低16位中,让高16位进行异或操作,让他的低16位同时保持高16位的特征,尽量避免一些hash值后续出现冲突,导致进入数组中同一个位置的问题。(让后16位尽量不一致,如果一样,会导致其放入数组中间的同一个位置,进行复杂的hash冲突的处理)

  • 寻址算法优化

(n-1)&hash 没有用hash值直接对数组长度进行取模,而是用hash值和数组长度-1进行与运算(&)

与运算(&):两位同时为1,结果才为1,否则为0

用与运算代替取模,提升性能

假设数组长度为16,所以n-1=15

【未优化的hash值】 1111 1111 1111 1111 1111 1010 0111 1100

【假设】 0000 0000 0000 0000 0000 0000 0000 1111

【优化和二进制

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值