【JVM】-NO.112.JVM.2 -【JDK11 HashMap详解-2-tab[i = (n - 1) & hash])剖析】
2024-08-27 02:53:27
Style:Mac
Series:Java
Since:2018-09-10
End:2018-09-10
Total Hours:1
Degree Of Diffculty:5
Degree Of Mastery:5
Practical Level:5
Desired Goal:5
Archieve Goal:3
Gerneral Evaluation:3
Writer:kingdelee
Related Links:
http://www.cnblogs.com/kingdelee/
http://www.runoob.com/java/java-operators.html
1.key是如何hash后去找到合适的坑填进去?
Node<K,V>[] tab; Node<K,V> p; int n, i;
logger.info("将table赋给tab");
if ((tab = table) == null || (n = tab.length) == 0) {
logger.info("table为null");
n = (tab = resize()).length; // 1.当未指定初始容量时,进行resize, 得到容量值赋给n=16; 获得新的节点给tab;已经存在节点时不再进来
logger.info("tab renTab");
}
logger.info("tab[i = (n - 1) & hash]): tab["+((n - 1) & hash)+"] i:" + ((n - 1) & hash) + ", hash:" + hash);
if ((p = tab[i = (n - 1) & hash]) == null) // i: (16-1) & 10 = 10,未存在节点的情况下,让新节点P指向数组节点tab中的hash后的节点,创建节点数组;已经存在节点时不再进来
{
logger.info("创建一个新节点,tab["+i+"]指向这个节点" + "hash:" + hash + ",value:" + value);
tab[i] = newNode(hash, key, value, null); // 仅在p节点为空的情况下,创建刚刚新节点指向hash后为空的节点的位置
}
重点看:
n = tab.length
或者
n = (tab = resize()).length; 填坑入槽:
tab[i = (n - 1) & hash]
初始化时,n为16.
推论:
1.ab进行&运算,c一定<=ab中的最小值;即 (n-1) & hash的值i,一定是在长度内的,不会越界,且坑位受hash的散列能力影响
疑问:如果len长度不是16而是17或者18呢?
即len是17时,n-1则为16,即a为16;len是18时,n-1则为17,即a为17
发现c有很多是一样的,即很多值都掉到同一个坑位里了。散列能力极差。
观察发现,有且只有a为1111,11111,111111....都是1时,b的递增,c才会依次递增
即a为是2的n次幂-1
结论:
1.len一定是2的次幂,才能保证横向散列的能力,让key能够松散的填入tab数组坑中。
最新文章
- 用Redis实现分布式锁
- C#的winform编程入门简单介绍
- sql server 关联更新
- web 页面内容优化管理与性能技巧
- 浅谈对git的认识
- Frame Stacking 框架堆叠
- Struts2文件下载浅析
- poj 1274 The Perfect Stall【匈牙利算法模板题】
- RHEL 7特性说明(六):集群
- ckeditor与ckfinder简单整合使用
- 在Linux系统如何让程序开机时自动启动
- Jquery插件之ajaxForm ajaxSubmit的理解用法
- jQuery 判断checkbox是否被选中 4种方法
- Oracle问题之字符集问题,登陆sqlplus出现问号
- Struts2笔记_拦截器
- Django----admin模块初识
- Mysql5.7 单表 500万数据迁移到新表的快速实现方案
- Python学习笔记第三周
- 5.1_非监督学习之sckit-learn
- [原创]K8飞刀20150720 新增Shellcode Loader支持多种格式
热门文章
- 【原创 深度学习与TensorFlow 动手实践系列 - 3】第三课:卷积神经网络 - 基础篇
- 在interface vlan下敲no ip proxy-arp什么意思
- maven添加jetty插件,同时运行多个实例
- [Linux]linux下取消用户名和密码直接登录
- VM虚拟机下安装CentOS_6.5_x64
- Linux c time模块函数库
- python学习笔记(四)
- HTTP简介,http是一个属于应用层的面向对象的协议
- python2.7.X 升级至Python3.6.X
- HTTP状态码--含义