初识HashMap之初始长度(二)

HashMap的初始长度为16,其次在自动扩展或手动初始化时,长度必须是2的幂。

初始值选择16是为了服务从key映射到index的哈希值。

上篇文章提到过初识HashMap(一)》,从Key映射到HashMap数组的对应位置,会用到一个Hash函数:

             index =  Hash("id")

如何实现一个尽量均匀分布的Hash函数呢?我们通过Key的HashCode值来做运算。

有人可能想到用取模的方式实现index =  HashCode(Key) % Length ,原理是一样的,不过取模的执行效率太低,采用位运算。


我们以key为book的为例进行计算:

1.计算book的hashcode,结果为十进制的3029737,二进制的101110001110101110 1001。


2.假定HashMap长度是默认的16,计算Length-1的结果为十进制的15,二进制的1111。


3.把以上两个结果做与运算101110001110101110 1001 & 1111 = 1001,十进制是9,所以 index=9。


可以说,Hash算法最终得到的index结果,完全取决于Key的Hashcode值的最后几位(与HashMap的长度有关)


为了尽量实现均匀分布,长度16或者其他2的幂,Length-1的值是所有二进制位全为1,这种情况下,index的结果等同于HashCode后几位的值。只要输入的HashCode本身分布均匀,Hash算法的结果就是均匀的。


如果使用的长度为10,对应的二进制为1100,则101110001110101110 1001&1100=1000

                                                                         101110001110101110 1011&1100=1000

 101110001110101110 1010&1100=1000


这样出现冲突的可能性更高,达不到均匀分布,所以用2的幂,对应的Length-1全是1,更有利于均匀分布






猜你喜欢

转载自blog.csdn.net/jerry_player/article/details/78585738