HashMap底层实现原理 + 源码

HashMap

 

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用null值 和 null键

查看构造方法:默认初始的容量为16 ,ArrayList默认初始值是 10 。 默认加载因子为0.75,什么意思呢?就是说当数据元素达到容量的75%时,就会进行扩容

方法和map中的方法是一样的

 

遍历的方法

 

HashMap源码分析

 

默认初始容量大小 : 1 << 4    (16)

最大容量大小 : 1  << 30 : 2的30次方

默认的加载因子: 0.75 

由于1.8之后增加了红黑树,所以hashMap也发生了一点变化增加了:

hashmap的链表变成红黑树的两个条件: 数组的长度大于64,链表的长度大于 8 

当链表的长度变成6了,红黑树就会变成链表了

 

 

刚创建好hashmap之后,没有添加元素的时候     table(数组)为  null , size = 0 ,数组长度不是16,因为还没赋值,这么做的目的是节省空间

在添加第一个数据的时候,数组大小就变成了16。

 

当数据添加到容量的0.75时,16*0.75 = 12,数据量达到12时,就会resize,变成原来的2倍,16*2 = 32 ,源码就是这个,左移了一位

 

 

HashMap的总结

1、HashMap刚创建的时候,table 为 null。为了节省空间,当添加第一个元素时,table的容量就会调整为16

2、当元素个数大于阈值(16*0.75 = 12)时,会进行扩容,扩容后的大小为原来的 2 倍。目的是减少调整元素的个数

3、jdk 1.8 当每个链表的长度大于 8,并且数组元素个数大于64 时,会调整为红黑树,目的是提高执行效率

4、jdk1.8 当链表长度小于 6时,调整为链表

5、jdk1.8 以前,链表是从头插入的,jdk 1.8之后变成了从尾插入

 

 

HashSet 的源码其实就是用的 hashMap, 其实都是差不多的存储结构,存储数据的原理都差不多

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你在狗叫什么、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值