从源代码分析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()赋值

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值