hashmap的哈希算法

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

三元运算符:条件表达式?表达式1:表达式2
^按位异或运算,只要位不同结果为1,不然结果为0;
“<<” 左移:右边空出的位上补0,左边的位将从字头挤掉,左移一位其值相当于乘2。
">>"右移:右边的位被挤掉,右移一位其值相当于除以2。

在这里插入图片描述
如图,h有32位,将其右移16位后,高位补0,原本处于高16位的1111 1111 1111 1111
就处于低16位。
再与最初的h进行异或运算。
为什么右移 16 位,为什么要使用 ^ 位异或?

一个好的哈希算法能够使得元素分布的更加均匀,从而减少哈希冲突。
有这样一个数学规律:
当 lenth = 2^n 时,X % length = X & (length - 1)
  也就是说,长度为2的n次幂时,模运算 % 可以变换为按位与 & 运算。
如:9 % 4 = 1
9 & 3 = 1001 & 0011 = 0001 = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值