Hash底层实现原理

Hash底层实现原理

1.创建HashMap集合对象

初始结构如下
table:数据存放位置【数组】
entrySet:映射关系
size:大小
modCount:版本
loadFactor:负载因子
threshold:临界值=容量大小 * 负载因子

2.向map对象添加数据后

添加一个数据后
数组大小变成16
临界值:16 * 0.75 = 12

3.向集合添加到12个数据

在这里插入图片描述

4.达到临界值后,在向map添加数据,进行扩容

添加13个数据
数组变为之前的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,把链表转换树形结构
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值