开发者社区> 问答> 正文

HashMap中扩容为什么是2的n次幂

已解决

HashMap中扩容为什么是2的n次幂

展开
收起
陌然浅笑-支 2022-04-06 11:27:11 19126 0
31 条回答
写回答
取消 提交回答
  • Hi there 👋 我是阿朗。公众号《程序猿阿朗》网站:https://www.wdbyte.com
    采纳回答

    为啥容量都是 2 的幂? 容量是 2 的幂时,key 的 hash 值然后 & (容量-1) 确定位置时碰撞概率会比较低,因为容量为 2 的幂时,减 1 之后的二进制数为全 1,这样与运算的结果就等于 hash值后面与 1 进行与运算的几位。

    下面是个例子。

    
    hash HEX(97)  = 0110 0001‬
    n-1  HEX(15)  = 0000 1111
    --------------------------
             结果  = 0000 0001
    # 计算得到位置是 1
    hash HEX(99)  = 0110 0011‬
    n-1  HEX(15)  = 0000 1111
    --------------------------
             结果  = 0000 0011
    # 计算得到位置是 3
    hash HEX(101)  = 0110 0101‬
    n-1  HEX(15)   = 0000 1111
    --------------------------
             结果   = 0000 0101
    # 计算得到位置是 5
    

    如果是其他的容量值,假设是 9,进行与运算结果碰撞的概率就比较大。

    
    hash HEX(97)  = 0110 0001‬
    n-1  HEX(09)  = 0000 1001
    --------------------------
             结果  = 0000 0001
    # 计算得到位置是 1
    hash HEX(99)  = 0110 0011‬
    n-1  HEX(09)  = 0000 1001
    --------------------------
             结果  = 0000 0001
    # 计算得到位置是 1
    hash HEX(101)  = 0110 0101‬
    n-1  HEX(09)   = 0000 1001
    --------------------------
             结果   = 0000 0001
    # 计算得到位置是 1
    

    另外,每次都是 2 的幂也可以让 HashMap 扩容时可以方便的重新计算位置。

    hash HEX(97)  = 0110 0001‬
    n-1  HEX(15)  = 0000 1111
    --------------------------
             结果  = 0000 0001
    # 计算得到位置是 1
        
    hash HEX(97)  = 0110 0001‬
    n-1  HEX(31)  = 0001 1111
    --------------------------
             结果  = 0000 0001
    # 计算得到位置是 1
    

    参考:HashMap 源码分析解读

    2022-04-06 13:32:27
    赞同 展开评论 打赏
  • image.png

    2022-04-20 17:04:27
    赞同 展开评论 打赏
  • 嗨嗨

    2022-04-20 13:54:29
    赞同 展开评论 打赏
  • 微信搜索「龙哥手记」,回复关键字:见面礼

    学习下

    2022-04-20 09:17:43
    赞同 展开评论 打赏
  • 学习

    2022-04-19 22:57:18
    赞同 展开评论 打赏
  • 666

    2022-04-18 09:37:02
    赞同 展开评论 打赏
  • 学习学习

    2022-04-17 13:24:47
    赞同 展开评论 打赏
  • 学习学习

    2022-04-17 10:39:21
    赞同 展开评论 打赏
  • 三天打鱼,两天晒网,两天休息

    这样计算哈希碰撞概率低

    2022-04-17 10:02:24
    赞同 展开评论 打赏
  • 学习

    2022-04-17 09:49:15
    赞同 展开评论 打赏
  • 学习学习

    2022-04-15 12:54:24
    赞同 展开评论 打赏
  • 学习

    2022-04-15 09:20:35
    赞同 展开评论 打赏
  • 学习

    2022-04-15 08:43:19
    赞同 展开评论 打赏
  • 学习了

    2022-04-14 14:22:17
    赞同 展开评论 打赏
  • 1

    2022-04-07 09:34:17
    赞同 展开评论 打赏
  • 6666

    2022-04-06 13:48:37
    赞同 展开评论 打赏
  • 1

    2022-04-06 13:02:41
    赞同 展开评论 打赏
  • 1

    2022-04-06 13:01:26
    赞同 展开评论 打赏
  • 1

    2022-04-06 13:01:26
    赞同 展开评论 打赏
  • 1

    2022-04-06 13:01:26
    赞同 展开评论 打赏
  • 1

    2022-04-06 13:06:19
    赞同 展开评论 打赏
滑动查看更多
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载