安杰小讲堂之HashMap(jdk1.8)

安杰:江德福,江德福,起床。德华你快去叫你哥起床。太阳都晒他的腚了。

德华:嫂子你咋一点儿都不心疼俺哥呢。好歹俺哥那么个大男人,每天都被你呼来喝去的。

江德福:来了来了,谁叫我呀。大早上的还不让人睡个安生觉。

安杰:睡什么睡,快点儿去吃饭,咱们还得接着昨天的课,继续聊聊hashmap 在jdk1.8中,是怎么实现的。

两人默默拿出了早就准备好的小板凳。一顿狼吞虎咽,然后乖乖坐好,看着小蓝板。

在这里插入图片描述
安杰:你俩觉得咱么应该从哪一点开始说呢?
江德福:我觉得把咱们首先得深入探讨一下这个安琪拉小姐姐。😝

德华:嫂子,我觉得要不先从第一点优化开始吧。

安杰:嗯,那就听德华的。不过江德福同志说的也没错。毕竟咱们得用到安琪拉小哥哥这篇博文的很多东西,所以得标注一下。
一个HashMap跟面试官扯了半个小时

江德福:原来不是小姐姐呀。😭(安杰,德华白眼)
安杰:好了,正经点儿,开始了。咱们还是先第一点优化开始吧。想一下链表和红黑树还有完全平衡二叉树的数据结构,然后你俩思考一下为什么要做将数组+链表优化为数组+链表或红黑树呢。

德华🙋‍♂️
安杰:好,德华你来说说。

德华:链表的特点是插入快,查询慢。完全平衡二叉树的特点是查询快,插入慢。但是红黑树查缺补漏,取精华去糟粕,它的查询比链表快,插入比完全平衡二叉树快。所以说,红黑树的性能还是挺强的。正好满足了hashmap的使用。

安杰:德华说的非常正确。 好,我们再来看看这张图。图中就可以看到6、8这两个存在于jdk1.8的hashmap中的阈值。他这样做,充分利用了链表和红黑树的特点。

在这里插入图片描述

江德福:安杰同志啊,🙋‍♂️那它为什么是8 和 6 呢?

(安杰白眼)安杰:这是经验得出来的值。就跟初始容量为16 一样的。

1.8中 的put方法在这里插入图片描述

hash的算法:因为我们已经是使用了红黑树,已经提高了查询效率,所以就不需要跟1.7中的那么多右移以及异或。
在这里插入图片描述
仔细看看下面这一部分,我觉的有了1.7 的基础。TreeNode 是红黑树。
在这里插入图片描述在这里插入图片描述

安杰:你们是不是发现了一个问题,在往链表中放置节点的时候,他已经不是向jdk1.7一样的头插法,而变成了尾插法。
一方面:因为我们需要在链表中看是否有与我们要加的key值相同的节点,既然要遍历链表,那么我们不如直接在尾部插入。
另一方面:这样可以解决1.7中多线程时可能会产生死循环的问题。因为我们每次都是往新链表的尾部去加节点,不用将e=e.next,你们想想,这样是不是就不会产生死循环了呢。
但是还有一个问题,那就是他可能会产生写覆盖,jdk1.7也会产生,不过上节课我们没提到。
江德福:那他是怎么产生写覆盖的呢?
安杰:数你猴儿急,我这不是就要开始说了🐎、、、

如果有两个线程A、B,当线程、、、、算了 不想跟你说了 直接看安琪拉小哥哥是怎么说的吧
江德福:哼,你不想说,老子还不想听了呢。(江德福踢掉板凳就走了)
在这里插入图片描述

安杰:德华,要不咱们今天就说这么多吧。那几个孩子快回来了,咱给他们做饭吧。
德华:嫂子,要不你还是去哄哄俺哥吧。
安杰:不用哄,你哥肯定是去找那个老丁下棋去了。吃饭的时候叫他就行。
德华:嗯,行,俺听你的。


文终~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值