之前一直在纠结为什么(n-1)&hash=hash%n,后来发现重点不应该是为什么(n-1)&hash=hash%n,而是为什么是(n-1)&hash。这里有个大前提就n必须是2的次幂,当n是2的次幂的时候n-1肯定在所以位上全是1,例如n=8,n-1的二进制位为0111,与n-1进行与操作就相当于对全是1的后三位随机赋0,这样可以得到0000-0111之间的所有值,所以不管(n-1)&hash和hash%n是否相等,前者都是可以做到均匀散列的,当然hash%n也可以做到均匀散列,为什么不是hash%n,这就涉及到底层运算的逻辑,简单来说就是与运算要比取模运算效率更高。
JDK源码学习记录---HashMap篇之为什么是(n-1)&hash
最新推荐文章于 2022-06-04 23:29:18 发布