HashMap源码解读
HashMap 1.8之后的解读
加入了红黑树,并且对hash函数加以改进
b).每个对象都有一个hashcode,但是hashmap并没有直接使用它,而是使用hash函数进行了一次处理,处理完之后用indexfor求出所在的位置。
对于1.7的hash,纯粹是数学计算,不用理会,可以看1.8的hash优化
c).1.8的的hash优化
static final int hash(Object key) {
int h; // 下面是将低16位和高16位做个异或运算,高16位保持不变
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
因为key的原始哈希值很大(int类型,32位),而数组很小,所以如果直接用的话,高位信息将会丢失,会增大冲突的可能性。所以java要做一个优化,将key原始的哈希值低16位和高16位做异或运算,不浪费高位资源,使得低位更随机,详细论述参看:
https://www.cnblogs.com/zhengwang/p/8136164.html
https://www.zhihu.com/question/62923854/answer/204445142
d).对于indexfor
1 static int indexFor(int h, int length) {
2 return h & (length-1);
3 }
h%length,当length是2的次幂时,等价于h & (length-1),因为length为2的次幂时,length - 1的低位全是1,高位全是0,位与运算保留hash值的低位,即对应的余数.位运算要比模运算要快
冲突会少,让数据均匀分布,因为16-1的二进制是1111(掩码)低位的四个全部保留,而15-1的二进制1110,只保留了低位的前三位,丢失了哈希值信息,可以参考下面实验

图片来自https://blog.csdn.net/qq_27093465/article/details/52207152
3.常见面试题
https://blog.csdn.net/u012512634/article/details/72735183
好文:http://www.importnew.com/28263.html
1.8详解:https://www.cnblogs.com/yangming1996/p/7997468.html
1.8 hash函数和tableSizeFor的理解:https://blog.csdn.net/fan2012huan/article/details/51097331
理解HashMap:
1.底层结构(数组+ 链表 / 数组+ 链表+ 红黑树 Entry数据结构)
用红黑树可以加快检索速度
2. put方法:
-- 解决冲突的方法(拉链法) 其他方法(开放地址法/再散列法)
-- hashcode()和equals的理解
https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%9F%BA%E7%A1%80.md#hashcode
-- 理解indexfor:
1)HashMap的桶的个数为什么是2的幂
2)为什么要rehash
3.扩容机制以及并发条件下hashmap成环问题
https://blog.csdn.net/u011305680/article/details/80511885
-- jdk7 总结
创建一个新的数组newTable,容量是oldTable的一倍
遍历oldTable,拿到每个链表
遍历链表,头插法插入newTable
-- jdk8 高低位链表
hash值h二进制为 0010 1100 1111 0001 1110 1110
旧容量为length=16,二进制为 0001 0000
两个相与,可以计算出低位第五位的二进制数是否是1,从而确定高低链
-- 成环问题 因为1.7是头插法,而头插法会导致成环 https://coolshell.cn/articles/9606.html hashmap1.8不会成环,因为尾插,但并发条件下还是用concurrenthashmap的好
4.键值允许为null,默认index=0
5.hashtable,hashmap,concurrenthashmap简要对比https://www.cnblogs.com/heyonggang/p/9112731.html
6.concurrenthashmap好文https://www.cnblogs.com/shan1393/p/9020564.html
7. 1.7和1.8的不同
-- 底层结构
1.7 数组加链表; 1.8 是数组加链表,再加红黑树(数量为8转成红黑树,数量为6转成链表)
-- hash方法
1.8的更加简单,高位右移十六位再做异或
-- 扩容机制的不同
1.8 不会成环(尾插)
· 1.8 不用再次求index(高低链表)
-------以上是优化
-- 扩容的条件
1.7 :size > threshold && bucket[hashIndex] != null
1.8:size > threshold
-- 1.8中的扩容包含了初始化
-- 为什么不用AVL https://blog.csdn.net/hustyangju/article/details/27214251?utm_source=tuicool
8 concurrenthashmap:
1.8相当于放弃了segment结构,直接使用数组的第一个对象作为该链表的锁。
HashMap源码解读的更多相关文章
- HashMap源码解读(转)
http://www.360doc.com/content/10/1214/22/573136_78188909.shtml 最近朋友推荐的一个很好的工作,又是面了2轮没通过,已经是好几次朋友内推没过 ...
- HashMap源码解读(JDK1.7)
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...
- jdk 8 HashMap源码解读
转自:https://www.cnblogs.com/little-fly/p/7344285.html 在原来的作者的基础上,增加了本人对源代码的一些解读. 如有侵权,请联系本人 这几天学习了Has ...
- 深入理解JAVA集合系列一:HashMap源码解读
初认HashMap 基于哈希表(即散列表)的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键. HashMap继承于AbstractMap,实现了Map.Cloneab ...
- hashMap 源码解读理解实现原理和hash冲突
hashMap 怎么说呢. 我的理解是 外表是一个set 数组,无序不重复 . 每个set元素是一个bean ,存着一对key value 看看代码吧 package test; import jav ...
- HashMap源码解读(jdk1.8)
1.相关常量 默认初始化容量(大小) static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 最大容量 static final int M ...
- HashMap 源码解读
HashMap在JDK1.7和1.8中有了很大的改变,空闲时间对HashMap做了一点点的研究. HashMap是一种数组和链表结合的数据结构,我们每次new一个HashMap时,都会构造出一个长度为 ...
- java集合之HashMap源码解读
源自:jdk1.8.0_121 HashMap继承自AbstractMap,实现了Map.Cloneable.Serializable. HashMap内部是由数组.链表.红黑树实现的 变量 // 默 ...
- JDK容器类Map源码解读
java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类.Dictionary是JDK最初 ...
随机推荐
- Java用Gson按照键值key排序json所有节点
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifa ...
- 新建web项目myeclipse基本设置
1. General --> Workspace --> UTF-82. General --> Editors --> Associations --> JSP --& ...
- Stanford CS231n实践笔记(课时22卷积神经网络工程实践技巧与注意点 cnn in practise 上)
本课主要2个实践内容: 1.keras中数据集丰富,从数据集中提取更多特征(Data augmentation) 2.迁移学习(Tranform learning) 代码:https://github ...
- openvas漏洞扫描
openvas配置步骤 1.-因为老师给的kali中自带的openvas,所以我们可以直接执行命令:openvas-check-setup来查看下他的安装状态: 如下图所示:在步骤7中出现错误,其中图 ...
- STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结
一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...
- 1.多表查询 => 转化为一张联合大表 2.可视化工具 3.pymysql模块
多表数据 create table dep( id int primary key auto_increment, name varchar(16), work varchar(16) ); crea ...
- day5 python
一.常量 在Python中没有一个专门的语法代表常量,程序员约定俗成用变量名全部大写代表常量.AGE_OF_OLFBOY=73二.基本运算符的补充1.算数运算符 print(10/3) print(1 ...
- 理解Linux文件系统之 inode
一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会 ...
- iOS 允许后台任务吗?
个人整理 1,用户层: 低电量模式 App后台数据刷新 的开关会影响App后台运行 2, 10分钟时间 后台任务: 在AppDelegate中加入以下代码:不受1影响 - (void)applic ...
- topcoder srm 525 div1
problem1 link 最后剩下的是中间的一个矩形.所以可以直接枚举这个矩形,如果它含有的硬币个数等于$K$,则再计算移动的最少次数,更新答案. problem2 link 首先,每个节点发送每种 ...