Hash底层实现原理
1.创建HashMap集合对象
table:数据存放位置【数组】
entrySet:映射关系
size:大小
modCount:版本
loadFactor:负载因子
threshold:临界值=容量大小 * 负载因子
2.向map对象添加数据后
数组大小变成16
临界值:16 * 0.75 = 12
3.向集合添加到12个数据
4.达到临界值后,在向map添加数据,进行扩容
数组变为之前的2倍 16->32
临界值也变成2倍 12->24
5.实现原理
(1)创建HashMap对象时候,初始化几个值,
- 主要:table代表数组默认null,负载因子默认0.75,边界值0
(2)第一次向HashMap添加元素
- 根据添加数据key计算hash值
- 判断当前table数组是否为空,第一次肯定是空,数组进行初始化
-- 数组容量 16 ,临界值 12
- 根据数组初始长度和hash值得到数组某个位置,在位置添加元素(第一次加不存在重复问题)
(3)容量不超过临界值12时候,再次添加数据
- 根据添加数据key计算hash值
- 根据数组长度和hash值得到数组某个位置,在位置添加元素
-- 判断数组这个位置上面是否存在元素,如果不存在,添加
-- 如果位置存在元素,
--- 判断位置元素key是否一样,如果key相同,替换,如果key不一样,链表存储
(4)容量超过临界值12,添加数据
- 根据添加数据key计算hash值
- 根据数组长度和hash值得到数组某个位置,在位置添加元素
-- 判断数组这个位置上面是否存在元素,如果不存在,添加
-- 如果位置存在元素,
--- 判断位置元素key是否一样,如果key相同,替换,如果key不一样,链表存储
-- 判断数组容量是否超过临界值,如果超过进行扩容
--- 把数组大小2倍,临界值2倍
--- 把数组元素重新编排
(5)在jdk1.8优化
- 如果数组容量64,链表节点8,把链表转换树形结构