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

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

📚 回答:

  • 背景知识 :

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

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

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

  • 为什么要减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。
    • 对于任意哈希值hash,hash & 15的结果范围是0~15,正好对应数组的索引范围。

    💡 面试官视角:

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

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


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

相关推荐
李纲明1 分钟前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy
文丑颜不良啊40 分钟前
LeetCode1461~1480题目解析
java·leetcode
2301_780789668 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
第九序言T8 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
m0_639906948 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
学长毕设9 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒9 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
步行cgn10 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川10 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵10 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程