搞不懂 HashMap?只因你缺一个 HashMap 的流程图!

Posted 业余草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搞不懂 HashMap?只因你缺一个 HashMap 的流程图!相关的知识,希望对你有一定的参考价值。

很多人搞不懂 HashMap,我认为究其原因是他们的学习方法不对!今天我总结了一个关于 HashMap 的 put 方法执行过程,分享给大家!

面试的时候,HashMap 基本上是必问的知识点。

很多人在回答的时候,照本宣科。HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null。HashMap 非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections 的synchronizedMap 方法使 HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。

我一眼就能看出,他是在面试之前做了功课。并不是真正的懂 HashMap,一个 put 方法就把他打回原形了!

学习好的人为什么学习好?因为别人善于总结!好了,废话不多说,看我的图!

简单的来说,可以用下面几句话总结!

①.判断键值对数组 table[i] 是否为空或为 null,否则执行 resize() 进行扩容;

②.根据键值 key 计算 hash 值得到插入的数组索引 i,如果 table[i]==null,直接新建节点添加,转向⑥,如果 table[i] 不为空,转向③;

③.判断 table[i] 的首个元素是否和 key 一样,如果相同直接覆盖 value,否则转向④,这里的相同指的是 hashCode 以及 equals;

④.判断 table[i] 是否为 treeNode,即 table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向⑤;

⑤.遍历 table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现 key 已经存在直接覆盖 value 即可;

⑥.插入成功后,判断实际存在的键值对数量size是否超多了最大容量 threshold,如果超过,进行扩容。

同样的,当你把 HashMap 的其他的方法都画出流程图,你会发现所有的东西都是那么的简单!

以上是关于搞不懂 HashMap?只因你缺一个 HashMap 的流程图!的主要内容,如果未能解决你的问题,请参考以下文章

宝付提醒:被自动扣款只因你忽视了它

因为太穷,不敢做梦,只因你的操作系统还处于1.0!

多线程和多进程不可能是鸡肋!只因你还不会!最全的进阶资料!

蔚来一面:HashMap 的 hash 方法原理是什么?看完这篇还不懂HashMap的hash原理,那我要哭了~

CDMA是啥东西呀!搞不懂呀!

还搞不懂闭包算我输(JS 示例)