从> >> >>>到hashmap 为什么 (h = key.hashCode()) ^ h >>> 16

>   >>   >>>int类型举例int4个字节,一字节八位
1 二进制标识为
00000000 00000000 00000000 00000001 
为了方便简写为
0000 0001

1. > 大于号

2. >>,带符号右移
以8-8举例
0000 1000
>>3
0000 0001 == 1

-8在计算机以补码展示,1000 1000 原码转补码 1111 1111,负整数的补码是符号位不变,其余位按位取反 ,再加1 ,正整数的补码是它本身
1000 1000 -转补码 1111 0111 +1 -1111 1111
>>3
1111 1111 转为源码(再去一次补码)1000 0001 == -1


3. >>> 无符号右移
8
0000 1000 
>>>3
0000 0001 =1
-8
>>>3
10000000 00000000 00000000 00001000                ->补码 11111111 11111111 11111111 11111111 
00011111 11111111 11111111 11111111(正数)   ->源码 00011111 11111111 11111111 11111111  == 536870911

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

异或(^)
基本操作: 相同出0,不同出1
另一个说法:无进位进行相加

10000100 10110011 11011111 11100001
00000000 00000000 10000100 10110011
使用了高位进行运算

因为获取地址的tab[(n - 1) & hash]方法
长度和hash相&,n-1大多情况下小于216次方,与hash的高16&,高16经过^运算,结果更加散列

随便说一句为什么用^,因为&|都会使得结果偏向0或者1 ,并不是均匀的概念,所以用^

参考
https://blog.csdn.net/shi_xiansheng/article/details/117792691
https://blog.csdn.net/qq_36191395/article/details/122472447?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%BA%90%E7%A0%81%E8%A1%A5%E7%A0%81%E8%BD%AC%E5%8C%96&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-122472447.142v71control,201v4add_ask&spm=1018.2226.3001.4187
https://blog.csdn.net/RitaAndWakaka/article/details/117358712?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167512695616800217066774%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167512695616800217066774&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-117358712-null-null.142v71control,201v4add_ask&utm_term=%3E%20%3E%3E%20%3E%3E%3E&spm=1018.2226.3001.4187

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值