> >> >>>
以int类型举例int占4个字节,一字节八位
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大多情况下小于2的16次方,与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