HashMap(一)——(n - 1) hash
理解 (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相关推荐
- 【Java面试小短文】HashMap是如何解决Hash冲突的?
欢迎关注Java面试系列,不定期更新面试小短文.欢迎一键三连! 文章目录 什么是Hash算法? 什么是Hash表? HashMap是如何解决Hash冲突的? 什么是Hash算法? Hash 算法, ...
- HashMap中Entry以及Hash值的理解
HashMap的底层结构如下: HashMap的底层结构是数组+链表 数组: HashMap以键值对存储数据,其中Key-Value都是Map.Entry中的属性.数组的值对应Value值,数组的下标 ...
- HashMap 计算key的hash值方法hash()
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >&g ...
- 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题
HashMap 前言 Hash HashTable 开地址法 线性探测法 平方探测法 双重散列探测法 拉链法 哈希表优势 HashMap 变量介绍 初始容量和负载因子 红黑树和链表转化 HashMap ...
- 什么是hash碰撞 , HashMap是如何解决hash碰撞的 ?
hash冲突问题解决方案:链表O(n)+红黑树O(logn) 正常一个位置放一对key-value,冲突后存放两对或多对key-value [<>]数组中这个位置会挂一个链表. 上面为本问 ...
- HashMap解决hash冲突的方法
HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...
- HashMap 怎么 hash?又如何 map?
2019独角兽企业重金招聘Python工程师标准>>> HashMap 是 Java 中 Map 的一个实现类,它是一个双列结构(数据+链表),这样的结构使得它的查询和插入效率都很高 ...
- mysql映射成hashmap_大厂面试必问!HashMap 怎样解决hash冲突?
HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...
- HashMap 如何解决 hash 冲突
HashMap 底层采用数组的结构来存储数据元素,数组的默认长度是 16,通过 put 方法添加数据的时候,HashMap 根据 key 的 hash 值进行取模运算,最终保存到数组的指定位置 这种设 ...
最新文章
- python批量分析表格_Python环境下百度Ocr表格批量识别
- linux 查明文密码,win10系统查看明文密码的操作方法
- Java类集框架 —— HashMap源码分析
- 【C# 委托 Lambda表达式】一个简单的例子
- NS 802.11函数分析(一)
- uboot启动第一阶段——start.S
- 揭开KPI异常检测顶级AI模型面纱
- mysql json 引号 双引号_关于JSON字符串key缺少双引号的解决方法 的讲解
- python小程序源代码_【程序源代码】Spring Boot 考试小程序
- Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[1]
- pytorch之参数的初始化
- matlab2c使用c++实现matlab函数系列教程-range函数
- hdu 3853 概率dp
- 树莓派 4b 可执行文件 无法双击运行_树莓派01 - 树莓派系统安装
- 最小二乘法-线性拟合
- 【c语言】复习无止境,day4--堆内存宏函数篇
- 《Total Commander:万能文件管理器》——第7.3节.总结与作业
- win10 wifi图标不见了 解决办法
- 如何成为技术大牛(华为超级技术大牛的十年经验总结)
- 【像素与浏览器视口的细节】及移动web设置“width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no“原因