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

相关推荐
启观川5 分钟前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
paopaokaka_luck11 分钟前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_9267870514 分钟前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev15 分钟前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by2099918 分钟前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说23 分钟前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha24 分钟前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞31 分钟前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
小白学大数据39 分钟前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
colinu1 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++