关于HashMap的问题

1.HashMap数组长度为啥是2的幂次方?

答:定位数组下标采用的是 哈希值%数组长度,即 hash(key)%M  ;因为%运算效率比较低,如果M是2的幂次方则会有这一特性 hash(key)%M = hash(key) & (M-1) ,而位运算与的效率比较高,HashMap就是采用 hash(key) & (M-1)来定位数组下标的;

 2.HashMap中hash方法为啥将hash值这么定义?

jdk8中如下:

(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)

h与h无符号右移16位的结果进行抑或操作;

如果直接采用key.hashCode(),那么定位数组下标的过程中可能用不到高位信息,这里采用抑或操作是将高位信息混合到低位,来降低哈希冲突;为啥用抑或而不是&或者|呢?&的会让结果向0靠拢(0 & 0 =0 ,0 & 1 = 0,1 & 0 =0,1 & 1 =1),|会让结果向1靠拢(0 | 0 = 0,0 | 1 =1,1 | 0 =1,1 | 1 =1),最终结果都不够平衡。

 

posted on 2019-07-31 12:57  mylittlecabin  阅读(133)  评论(0编辑  收藏  举报

导航