面试高频问题:HashMap实现原理

栏目: Java · 发布时间: 5年前

内容简介:今天给同学们讲讲一个面试经常遇到的高频问题,HashMap实现原理,希望在金三银四的季节对同学们有帮助。HashMap结构图目录##五、resize方法

今天给同学们讲讲一个面试经常遇到的高频问题,HashMap实现原理,希望在金三银四的季节对同学们有帮助。

面试高频问题:HashMap实现原理

HashMap结构图目录

一、唠叨

二、解析思路

三、get方法

四、put方法

##五、resize方法

一、唠叨

认真阅读了下HashMap的实现方式,也参考了网上别人的一些解析,个人觉得还是有些东西想说。网上有的文章名字为HashMap源码解析,实际上就是给它里面的一些方法加上一些注释而已,有不少都是这样的。 我自己看源码的时候,发现不是别人不想解析,而是它的实现真的需要亲自研读,多理顺几遍才知道怎么回事。 我在这里解析的文字描述也较多,不管谁的解析,自己也都要看一下JDK源码的具体实现,我们仅提供参考而已。

##二、解析思路 源码不太方便看,先说明一下我的阅读思路。 1.把常用的几个方法拷贝到文本编辑器里面。 2.HashMap中不同的时候会有不同的流程,梳理方法中的逻辑流程。就像采用极端法,采用特殊的数据,然后查看方法执行语句。未执行的语句暂时不考虑。 3.注释源码...我觉得HashMap的实现方式不够好,关键的几个方法里面包含的情况太多了,阅读起来是有难度的,而写程序的目的之一不就是让其他开发者阅读吗?一个方法内部做了太多的事情,违反了代码整洁的规则,一个函数做要尽量少的事情。 解析 之前稍微介绍了一些HashMap的特性,HashMap初探。 ( www.jianshu.com/p/be9ffb76d…

##三、get方法 先挑最简单的说

面试高频问题:HashMap实现原理

1 先从数组下标,找到对应的Node2. 2 如果Node里的第一个节点命中,直接返回 3 如果有冲突,则通过key.equals(k)去查找对应的entry 4 若为树,则在树中通过key.equals(k)查找,O(logn); 5 若为链表,则在链表中通过key.equals(k)查找,O(n)。put方法这个中间涉及的逻辑多一些,方法需要分不同的步骤看。

面试高频问题:HashMap实现原理

##四、put方法 这个中间涉及的逻辑多一些,方法需要分不同的步骤看。 思路: 1对key的hashCode()做hash,然后再计算index; 2如果没碰撞直接放到bucket里; 3如果碰撞了,以链表的形式存在buckets后; 4如果节点已经存在就替换old 5value(保证key的唯一性) 6如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD),就把链表转换成红黑树; 7如果Node的容量满了(超过load factor*current capacity),就要resize。

面试高频问题:HashMap实现原理
面试高频问题:HashMap实现原理

一般不发生碰撞的时候,相对简单,数据量较小的情况下。

面试高频问题:HashMap实现原理

我解释下关于碰撞冲的循环。 1.查看是否存在相同的key,存在相同的key跳出循环,覆盖key的value。 2.如果不存在相同的key,在链表末尾插入新的Node如果链表节点过长,转换为树。 3.如果链表节点过长,转换为树。

面试高频问题:HashMap实现原理

红黑树的部分,我们下次单独解析

五、resize方法

这个涉及的内容,有不少线需要捋一捋。首先看申明时候会resize()。它们都在调用put的时候执行的。

1.table == 的时候

面试高频问题:HashMap实现原理

2.键值映射的的数目大于临界值的时候。

面试高频问题:HashMap实现原理

六、resize具体方法

面试高频问题:HashMap实现原理
面试高频问题:HashMap实现原理

如果是第一次resize,我们抽出来会执行到的语句。 1.初始化容量 2.初始化threshold,也就是初始化临界值,决定了table的键值对数目到什么时候会再次resize()

面试高频问题:HashMap实现原理

第二次及后续的resize执行流程

面试高频问题:HashMap实现原理
面试高频问题:HashMap实现原理

resize中对有碰撞的链表的操作写的很有意思,再叙述一下。在重新分配索引的时候,有重新组建链表的操作。

举个比较夸张的例子,读者就明白了。 1.e.hash < 2,那么e.hash&oldCap就等于0,索引为小于之前hash表大小以内的索引。也就是当初的索引不变。 2.e.hash > 2的时候,e.hash&old不等于0,那么它的索引就为当前表的索引再加上新扩容的大小。

面试高频问题:HashMap实现原理

案例图

这个图说的是,当hashmap的表大小为2扩充到4的时候,原本挂载在1位置的链表,重新分配之后的样子。

面试高频问题:HashMap实现原理

最后 篇幅有限,我这里仅仅介绍了get方法,put方法,resize方法的具体原理,文章就已经非常长了,不利于阅读。 下次再补充一下HashMap的hash方法原理,其余的相关注意事项。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

用户至上:用户研究方法与实践(原书第2版)

用户至上:用户研究方法与实践(原书第2版)

凯茜·巴克斯特 / 王兰、杨雪、苏寅 / 机械工业出版社 / 2017-5-1 / 99

《UI/UE系列丛书 用户至上:用户研究方法与实践(原书第2版)》是用户研究方法指南,谷歌用户体验研究员十几年工作经验结晶,从理论到实战,包含完整的实操案例,是设计以人为中心产品的实用手册。 《UI/UE系列丛书 用户至上:用户研究方法与实践(原书第2版)》包含五个部分共15章。入门篇包括第1~5章:介绍用户体验入门,如何理解目标用户,道德与法律问题,如何搭建研究设施,如何选择用户体验研究方......一起来看看 《用户至上:用户研究方法与实践(原书第2版)》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具