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

不少人搞不懂 HashMap,我认为究其缘由是他们的学习方法不对!今天我总结了一个关于 HashMap 的 put 方法执行过程,分享给你们!面试

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

不少人在回答的时候,照本宣科。HashMap 根据键的 hashCode 值存储数据,大多数状况下能够直接定位到它的值,于是具备很快的访问速度,但遍历顺序倒是不肯定的。HashMap 最多只容许一条记录的键为 null,容许多条记录的值为 null。HashMap 非线程安全,即任一时刻能够有多个线程同时写 HashMap,可能会致使数据的不一致。若是须要知足线程安全,能够用 Collections 的synchronizedMap 方法使 HashMap 具备线程安全的能力,或者使用 ConcurrentHashMap。安全

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

学习好的人为何学习好?由于别人善于总结!好了,废话很少说,看个人图!学习

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

简单的来讲,能够用下面几句话总结!线程

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

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

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

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

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

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

一样的,当你把 HashMap 的其余的方法都画出流程图,你会发现全部的东西都是那么的简单!

相关文章
相关标签/搜索