【大白话说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基础篇

相关推荐
勇气要爆发1 小时前
006.注解
java·注解
烈风逍遥1 小时前
第六篇:RAG 知识库构建与检索全链路
前端·人工智能·后端
花椒技术1 小时前
Agent 沙箱怎么接入生产?花椒的选型、持久化与执行协议实践
人工智能·后端·agent
liuchangng1 小时前
Jev 模型研究:从生成式大模型到决策式模型——System One、RLCD 校准与采用边界
java·javascript·人工智能·python·深度学习
GPU实战笔记1 小时前
本地跑不动 llama.cpp,临时租云 GPU 怎么搭?从启动服务到环境复用
java·服务器·网络·人工智能·深度学习·llama
miller-tsunami1 小时前
排序的相关知识点
数据结构·排序算法
独泪了无痕1 小时前
Hutool之ArrayUtil:解锁数组操作的新境界
后端
撸串-研究生1 小时前
SSM + Vue 线上作业批改系统:在线答题、文件提交与教师批改闭环90608
java·ssm·在线答题·作业批改·文件提交
一 乐1 小时前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
wang_shu_mo_ran1 小时前
Spring MVC 常用注解和用法(二)——url,cookie,session
java·mvc