tab[i = (n - 1) & hash] 的详细解读
n代表tab数组的容量16 -1(数组下标索引从0开始)
这里的hash是经过hash(key)计算好的
首先按位与操作(&),就是将两个操作数转换成2进制,根据1 1 = 1 ,1 0 = 0, 0 0 = 0的规则进行计算
按照上边程序的数据,来做分析
当前的hash:2080,n = 16
(n - 1) & hash = 15 & 2080
设想一下按位与操作1 1 才得1,而15的二进制数为0000 0000 0000 1111 前12位为0基本不用看了,不管2080的二进制数0000 1000 0010 0000 前12位是多少,最终的结果的前12位都是为0
tab[i = (n - 1) & hash] 的设计,保证了i的取值在[0,15]这个闭区间内
还有一个重要的原因,就是 (n-1)& hash = hash % n ,想要满足这条等式的前提就是,n必须是 2的a次幂才行
为什么呢?
因为2的n次幂的10进制数转换为2进制数,就只有一个1,其余都为0,比如说 16(十进制)= 10000(二进制)
16 = 2^4 转换为2进制后在n=4前一位就是1,也就是10000,而前面的15是通过16-1的来的,也就是10000-1 得到01111,此时将2080转换为2进制为0000 1000 0010 0000,与01111进行按位与操作,最终的结果等于2080%16 = 0
总结 当一个数满足 m = 2^n 则 a % m = a & (m-1)
到这里很多小伙伴就会问,为什么要这么做呢?
首先2进制位运算肯定比取余运算快,其次不管是HashSet,LinkHashSet维护的table的容量都是2^n方,这也保证了(n-1)& hash 设计的合理性
以上内容仅为个人解读,如有误解,请在评论中指教,谢谢