从源代码分析HashMap实现原理

HashMap
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。另外,HashMap是非线程安全的,也就是说在多线程的环境下,可能会存在问题,而Hashtable是线程安全的。

HashMap继承抽象类AbstractMap,实现Cloneable, Serializable接口。
AbstractMap实现Map接口。

HashMap的主干是数组,由数组和链表组成(链和树)
capacity一定是2的次幂
loadFactor 阈阀 默认为0.75
threshold = capacity * loadFactor 阈值
hash算法不相同,其中一种hash = (h = key.hashCode()) ^ (h >>> 16)
查找下标如果遇到相同hash,则查找链表

HashMap内部方法字段
在这里插入图片描述

在这里插入图片描述
先看四个构造函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个方法用于找到大于等于initialCapacity的最小的2的幂
DEFAULT_LOAD_FACTOR = 0.75f
MAXIMUM_CAPACITY = 1 << 30
因此,loadFactor默认为0.75,threshold最大为1073741824
在这里插入图片描述
使用putMapEntries初始化
在这里插入图片描述
table如下,是一个不需要序列化的Node
在这里插入图片描述
Node是实现了Entry的内部类,每个节点包括哈希数,键,值,下个节点的引用,
但节点的hashCode是键值异或生成的,equals判断键值。
在这里插入图片描述

resize()扩容
hash()
在这里插入图片描述
key的高16位不变,低16位与高16位异或。
下标计算index =(table.length -1) & hash
putVal()赋值

纯属个人笔记,有疑问请评论。

猜你喜欢

转载自blog.csdn.net/txbbbb/article/details/84590514