当前位置: 首页 > article >正文

HashMap为什么数组长度是2的幂

首先,先说结论:主要是为了在取模和扩容时做优化

  1. 简化取模运算:将a%length转换成a&(length-1),位运算更快
  2. 扩容的时候我们需要重新计算元素在新数组中的位置,此时我们不需要再次哈希取余,元素在新数组的索引就在:原索引或者原索引+原数组容量

本文主要解答为什么数组长度是2的幂时可以将a%length转换成a&(length-1)

  • 例如a=105=0110 1001b=16=0001 0000 ,可以看到2的幂二进制表示只有一个1

  • 取余操作本质是:a%b=a-b*c,这个c指的是b倍乘c后不超过a的最大数

  • 此时只需要确定c就能求出余数,而二进制中往左移一位就表示扩大两倍,那么如果b的二进制表示只有一个1其他全是0的话

    • 此时a的二进制表示中对应b这个1所在的那一位开始往左的数中
      1. 只有一个1,那么就可以知道b左移x次就能得到,即c=x*2,此时余数就是a中往右的二进制,例如a=0100 1001,b=0001 0000,此时c=4,余数是1001
      2. 有多个1,例如a=0110 1001,b=0001 0000,此时c=2*1 + 2*2,那么余数也是1001
  • 由此可知,当a%b的时候如果b的二进制表示中只有一个1,那么余数就是a中对应b这个1所在位右边的二进制表示的数

    • 那么如何计算能使a=0110 1001得到0000 1001
      • 0000 1001 = 0110 1001 & 0000 1111 = a % (b-1)

http://www.kler.cn/a/15458.html

相关文章:

  • 基于单片机智能温室大棚监测系统
  • JavaScript中如何使用Promise处理异步操作?
  • 【springboot】启动原理
  • 直接映射4条 cacheline,每条cacheline32位数据(混乱版)
  • Java 动态代理初步
  • 【Mysql】Mysql的多表查询---多表联合查询(上)
  • 如何真正认识 Linux 系统结构?这篇文章告诉你
  • 【VM服务管家】VM4.x算子SDK开发_3.1 环境配置类
  • ChatGPT探索系列之五:讨论人工智能伦理问题及ChatGPT的责任
  • Docker consul的容器集群的部署|consul-template部署
  • 【论文阅读】轻量化网络MobileNet-V1
  • IDEA弹出`Lombok requires enabled annotation processing`错误信息
  • Codeforces Round 867 (Div. 3)
  • Mysql 存储过程 / 存储函数
  • 博弈论又称对策论的入门及在军事博弈问题上的简单实战
  • conda命令
  • 【MySQL】数据表的增删查改
  • ChatGPT技术原理 第六章:对话生成技术
  • 【VQ-VAE代码实战】Neural Discrete Representation Learning
  • Kafka3.0.0版本——生产者数据有序与乱序
  • 在linux下搭建clash服务
  • 学生成绩管理系统 002
  • Java阶段二Day07
  • Java版企业电子招投标系统源码 Spring Cloud+Spring Boot 电子招标采购系统功能清单
  • 什么是FAQ页面?如何设计一个优秀的FAQ页面?
  • 【unity项目实战】3DRPG游戏开发06——敌人和攻击