关于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) 编辑 收藏 举报