java hash原理_《Java基础知识》Java Hash底层原理

前言

了解到JDK8对HashMap进行了优化,就一起了解一下JDK8的HashMap。

原理

1. 哈希表的原理

首先需要一张Hash表,Java通过数据实现:默认长度位16,并且。

7acf975d36dfbce8f1f6f90175b70f55.png

第一步插入张三(哈希值11):

358b56904ce8bd957f1b08822e0ed1db.png

第二步插入李四(哈希值12):

afe5b893708e1e064700cc6dd62e5006.png

第三步插入李磊(哈希值12):

9a208cfc0c9590a3045410552bbb0e5e.png

从上图我们基本可以看出Java HashMap的存储原理。

2. JDK8在什么情况会将链表转化成红黑树?

811cd057bfbced3d7edcb023b361ff3b.png

上图中如果12这个位置的数据存放太多了,超过8个,这个时候Java 就会将链表转化成红黑树,(这个要注意如果数组长度低于64是不会转红黑树的)。

8afa46320e304db1f475393a76291313.png

3. Hash 不可能一直是16 这么长,那什么时候扩容呢,Java代码中写了当存入数据超过hash表长度的3/4 就会扩容扩容的逻辑为翻倍。

即:16 --> 32 --> 64 -- 128 这样。

hash表扩容所有已经存的值的hsah值都需要重新计数,再放入新的hash表中, 这个操作比较消耗性能,所以这里存在一个优化点。

如果我们知道map需要被使用的长度是多少,可以在创建HashMap的时候知道长度:

Map hashMap = new HashMap(64);

总结

1. JDK8 Hash表有自动扩容的功能。 扩容会重新将节点放入新的hash表中。

2. 底层数据结构:JDK8为 数组+链表+红黑树,之前为数组+链表。

3. JDK8中链表在长度超过8并且数组大于64的时候,自动由链表转成红黑树。

4. Hash表在元素大于3/4 长度的时候进行Hash表扩容(每次翻倍)。

5. HashMap是线程不安全的,如果需要线程安全可以使用ConcurrentHashMap。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值