【大白话说Java面试题】【Java基础篇】第20题:HashMap在计算index的时候,为什么要对数组长度做减1操作

第20题:HashMap在计算index的时候,为什么要对数组长度做减1操作

📚 回答:

  • 背景知识

    HashMap中,元素的存储位置(索引)通过位运算计算得出,公式为:

    java 复制代码
    index = (length - 1) & hash;

    其中,length是数组长度,hashkey的哈希值。

  • 为什么要减1?

    • 原因1:数组长度是2的幂

      • HashMap要求数组长度必须是2的指数次幂(如16、32、64)。
      • 如果数组长度是2的幂,那么length - 1的二进制表示就是全1(如15的二进制是1111)。
      • 这样,hash & (length - 1)的结果等价于hash % length,但效率更高(位运算比取模运算快)。
    • 原因2:确保结果落在数组范围内

      • 位运算的结果最大只能是length - 1,因此索引始终会落在数组的有效范围内,不会发生越界。
  • 底层原理

    • 示例:假设数组长度为16(即length = 16),则length - 1 = 15,其二进制为1111
    • 对于任意哈希值hashhash & 15的结果范围是0~15,正好对应数组的索引范围。

    💡 面试官视角

  • 面试官可能会问"为什么不直接用取模运算?"答:取模运算效率较低,而位运算更快且等价于取模运算(前提是数组长度是2的幂)。

  • 面试官可能会追问"如果数组长度不是2的幂会怎么样?"答:会导致索引计算不均匀,增加冲突概率,影响性能。


📌 专栏 :大白话说Java面试题 --- 01-Java基础篇

相关推荐
Larcher7 小时前
React Router 不只是页面跳转:从 SPA 路由到权限守卫的完整实践
javascript·后端
Larcher7 小时前
大模型为什么每次回答都不一样?一文搞懂 Temperature、Top K 与 Top P
javascript·后端
名字还没想好☜9 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
LucianaiB9 小时前
毕业老学长给我留的最后一句话是:“AI 写的,别挂我名。” 我直接 神(Seed Evolving) 来!助我!
后端
IvanCodes9 小时前
RAG 实战教程(一):RAG 工作原理与完整流程——分片、索引、召回、重排和生成
人工智能·后端·agent
·薯条大王9 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
CodeSheep10 小时前
稚晖君公司人事大变动,来了!
前端·后端·程序员
小满zs10 小时前
Go语言第八章(函数)
后端·go
白狐_79811 小时前
408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结
数据结构
kyriewen12 小时前
面试官问"这段逻辑为什么这样写"——我才发现,这半年我写的代码,我自己都解释不了
前端·javascript·面试