理解 (n - 1) & hash

HashMap中存值的时候需要计算位置,具体的算法为 (n - 1) & hash
为什么不使用 hash % n
我们来简单理解一下
n是map的容量,等于2 的幂
例如:

100 / 8 = 12
100 % 8 = 4
如果使用二进制的位运算的话,除以8[2 ^ 3]就是向右移了3位
0110 0100 >> 3 = 0000 1100[100]
0000 1100 = 12 就是商
100 = 4 就是余数
也就是0110 0100的后3位:100

想一下,hash除以n = 2 ^ m,就是hash值的二进制数向右移动了m位,而余数就是hash的后m

除以8,向右移动3位;除以16,向右移动4位;除以32,向右移动5位 …

那么怎样快捷把这几位表示出来呢
我们首先就想到的是使用 & 符号,有几位余数,我们就使用几个1
例如:

三位余数:100 & 111 = 100
四位余数:1100 & 1111 = 1100
五位余数: 11100 & 11111 = 11100

那么到这里,就解决了一半
但是在计算 hash % n的时候怎么构造这m个1呢

n = 2 ^ m
n是10000的形式
例如:
8 = 1000 = 2 ^ 3
16 = 10000 = 2 ^ 4
32 = 100000 = 2 ^ 5
发现了吗,n表示成2进制的位数是 m + 1
而n - 1刚好就是m位,而且全都是1,完美解决
8 - 1 = 111
16 - 1 = 1111
32 - 1 = 11111

综合看来 hash % n = hash & (n -1)
而后者是使用二进制的逻辑运算,底层运算,效率肯定会高很多

持续更新 -_-

HashMap(一)——(n - 1) hash相关推荐

  1. 【Java面试小短文】HashMap是如何解决Hash冲突的?

    欢迎关注Java面试系列,不定期更新面试小短文.欢迎一键三连! 文章目录 什么是Hash算法? 什么是Hash表? HashMap是如何解决Hash冲突的? 什么是Hash算法?   Hash 算法, ...

  2. HashMap中Entry以及Hash值的理解

    HashMap的底层结构如下: HashMap的底层结构是数组+链表 数组: HashMap以键值对存储数据,其中Key-Value都是Map.Entry中的属性.数组的值对应Value值,数组的下标 ...

  3. HashMap 计算key的hash值方法hash()

    static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >&g ...

  4. 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题

    HashMap 前言 Hash HashTable 开地址法 线性探测法 平方探测法 双重散列探测法 拉链法 哈希表优势 HashMap 变量介绍 初始容量和负载因子 红黑树和链表转化 HashMap ...

  5. 什么是hash碰撞 , HashMap是如何解决hash碰撞的 ?

    hash冲突问题解决方案:链表O(n)+红黑树O(logn) 正常一个位置放一对key-value,冲突后存放两对或多对key-value [<>]数组中这个位置会挂一个链表. 上面为本问 ...

  6. HashMap解决hash冲突的方法

    HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...

  7. HashMap 怎么 hash?又如何 map?

    2019独角兽企业重金招聘Python工程师标准>>> HashMap 是 Java 中 Map 的一个实现类,它是一个双列结构(数据+链表),这样的结构使得它的查询和插入效率都很高 ...

  8. mysql映射成hashmap_大厂面试必问!HashMap 怎样解决hash冲突?

    HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...

  9. HashMap 如何解决 hash 冲突

    HashMap 底层采用数组的结构来存储数据元素,数组的默认长度是 16,通过 put 方法添加数据的时候,HashMap 根据 key 的 hash 值进行取模运算,最终保存到数组的指定位置 这种设 ...

最新文章

  1. python批量分析表格_Python环境下百度Ocr表格批量识别
  2. linux 查明文密码,win10系统查看明文密码的操作方法
  3. Java类集框架 —— HashMap源码分析
  4. 【C# 委托 Lambda表达式】一个简单的例子
  5. NS 802.11函数分析(一)
  6. uboot启动第一阶段——start.S
  7. 揭开KPI异常检测顶级AI模型面纱
  8. mysql json 引号 双引号_关于JSON字符串key缺少双引号的解决方法 的讲解
  9. python小程序源代码_【程序源代码】Spring Boot 考试小程序
  10. Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[1]
  11. pytorch之参数的初始化
  12. matlab2c使用c++实现matlab函数系列教程-range函数
  13. hdu 3853 概率dp
  14. 树莓派 4b 可执行文件 无法双击运行_树莓派01 - 树莓派系统安装
  15. 最小二乘法-线性拟合
  16. 【c语言】复习无止境,day4--堆内存宏函数篇
  17. 《Total Commander:万能文件管理器》——第7.3节.总结与作业
  18. win10 wifi图标不见了 解决办法
  19. 如何成为技术大牛(华为超级技术大牛的十年经验总结)
  20. 【像素与浏览器视口的细节】及移动web设置“width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no“原因

热门文章

  1. java odata filter响应_使用OData技术遇到的问题及解决办法
  2. Mobaxterm使用小技巧(log文件、宏命令录制)
  3. inherits在java中是什么属性_inherits属性
  4. STM32实现RFID刷卡加一,再次刷卡减一
  5. python爬取京东商品数据要先登录_京东商品评论情感分析|文本数据预处理
  6. 福禄克网线测试RL(回波损耗)不通过有什么解决办法
  7. 【牛客前端刷题】JS拔高篇
  8. 技校计算机专业视频编辑,技校视频
  9. 图像保存为二进制文件及二进制文件读出图像数据
  10. 深度学习8-加速强化学习训练的方法