码迷,mamicode.com
首页 > 其他好文 > 详细

一道简单的HashMap面试题所想到的...

时间:2018-11-22 02:57:07      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:源码   tps   辅助   src   jdk   文字   出现   ble   假设   

前言

看到一个JDK1.7和JDK1.8中关于HashMap的一个面试题:

JDK1.7和1.8中HashMap中链表的插入的方式有什么不同?

原以为自己对HashMap的源码理解的还算可以了,应该足够应付面试了。但是看到这个问题自己确实也是懵逼了一下。
查了下资料,答案是JDK1.7是插入到首部,1.8改为了尾部。

 

 

既然有改变那么就想知道是为什么了,原因其实很简答,JDK1.7中经常面试会问 并发下put 为何会导致死循环?
其实这个死循环到了JDK1.8 就不会出现了,仅仅是因为 put的后的数据放到了链表的尾部。

这里再回顾下JDK1.7 的循环导致死循环的问题,下面的图是手画图,辅助文字说明:
JDK1.7 扩容主要代码:
技术分享图片

假设:HashMap中table的大小为2,有两个元素3.7,5 这时会进行扩容,图如下:
技术分享图片

图画的很简陋,自己看着边看代码边想出来的。哈哈哈,总感觉用一些在线画图工作看着很别扭,而且是没有灵魂的。(不瞎扯了,扯远了)
这里主要是元素3,7形成了死循环,所以这里会出现问题。

而在JDK1.8 中,因为插入顺序变成了尾部插入,也就是说3的next一直都会为7,元素扩容的情况下不会改变元素的顺序,所以就可以避免这种死链了。

果然看似不起眼的设计都是有自己独特的道理,又加深了自己对HashMap的理解了,每天都能进步一点点,真好。
感谢掘金文章的帮助:HashMap为何从头插入改为尾插入

一道简单的HashMap面试题所想到的...

标签:源码   tps   辅助   src   jdk   文字   出现   ble   假设   

原文地址:https://www.cnblogs.com/wang-meng/p/db8bf82890d552b89674b7d58cacd207.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!