为什么HashMap底层对指定容量处理为2的幂次方大小要使用31做运算

img


为什么HashMap底层对指定容量处理为2的幂次方大小要使用31做运算,并且做减法运算

int 类型数位限制

HashMap底层对指定容量处理为2的幂次方大小要使用31做运算的原因是因为31是一个质数,并且31的二进制表示为11111,即31是一个由5个1组成的二进制数。这个性质使得使用31做运算可以优化HashMap的性能和散列均匀性。

具体来说,使用31做运算可以让散列结果更加均匀地分布在HashMap的桶中。在HashMap中,散列结果决定了元素存储在哪个桶中。如果散列结果不均匀,就会导致某些桶中的元素较多,而其他桶中的元素较少,从而影响HashMap的性能。因此,为了使散列结果均匀,可以通过将散列结果与一个质数进行运算来实现。31是一个比较小的质数,而且由于它的二进制表示中有5个1,可以使得散列结果在进行位运算后更加均匀地分布在桶中,减少碰撞的概率,从而提高HashMap的性能。

另外,31是一个比较小的质数,这样可以让运算速度更快,同时又足够大,可以减小哈希冲突的概率。因此,使用31作为运算因子,可以在保证散列均匀性的同时,提高HashMap的性能。