-
HashMap 位运算原理整理
hash计算公式: h ^ (h >>> 16)
h 为 Java native 计算得出的hash值,int类型32位
假如 h 值如下:
h dec: 2026691355
h bin: 01111000110011001101101100011011
h 无符号右移(>>>)16位结果:
bin: 00000000000000000111100011001100
dec: 30924
hash异或(^)30924
结果:
01111000110011001101101100011011
00000000000000000111100011001100
--------------------------------
01111000110011001010001111010111
高16位没变,第16跟高16位异或,最终计算得:
bin: 01111000110011001010001111010111
dec: 2026677207
计算数组下角标公式:(n - 1) & hash
n 为数组长度,假如当前长度为 128
(128 - 1) & 2026677207
128 - 1 结果:
dec: 127
bin: 1111111
与运算:
00000000000000000000000001111111
01111000110011001010001111010111
--------------------------------
00000000000000000000000001010111
结果:
dec: 87
bin: 00000000000000000000000001010111
因为数组长度 n 为 2的幂次方,所以所有 n -1 的二进制值为:低位指数m个1高位补零
比如上方数组长度为128,为2的7次方。 128-1 为 127 用二进制值表示必定为低位7个1高位补零:
00000000000000000000000001111111
而任何数与 00000000000000000000000001111111
进行与运算的计算结果必定在 00000000000000000000000001111111
范围内(因为高位都是0低位都是1与其与运算得出的结果高位仍然还是0),所以计算得出的数组下标必定不会超过数组长度(类似与取模运算)。
扩容两倍:newCap = oldCap << 1
左移一位就相当于 oldCap * 2
原文:https://www.cnblogs.com/lionsblog/p/14298974.html
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
数据库审计与智能监控:从日志分析到异
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比