HashMap常见问题

1. hashMap如何计算key的hash值?为什么?

hash = (h=key.hashCode()) ^ (h >>> 16)

因为在计算下标值的时候,采用的公式如下,其中n是table的长度。

index = (n-1) & hash

计算index的时候,都是取hash值的低n位,高位无法参与运算。为了降低hash碰撞的概率,取高16位和低16位异或的结果作为新的低16位,这样低16位中融合了高16位的特征,这又称为扰动函数

2. 为什么hashMap的table长度都是2的n次幂?

  • 和下标值的计算公式有关。方便进行&运算,提高效率,&比取模运算的效率高
       index = (n-1) & hash

table的长度是2的n次幂,才可以使用上面的公式计算下标值。因为n-1的二进制的低n位是“低位掩码”(都是1),使得hash的低n位都可以参与到index的计算中来。
举例说明,假如让n=14,那么n-1(13)的二进制表示就是1101,index的末尾第二位永远不会等于1。也就是说末尾第二位是1的index,永远不会被命中。

  • 和扩容过程中Node的迁移有关。令table长度是2的n次幂,则只需要观察
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值