
你知道的越多,你不知道的越多
点赞再看,养成习
正文
一个婀娜多姿,穿着衬衣的小姐姐,拿着一个精致的小笔记本,径直走过来坐在我的面前。
看着眼前这个美丽的女人,心想这不会就是Java基础系列的面试官吧,真香。
不过看样子这么年轻应该问不出什么深度的吧,嘻嘻。(哦?是么 )

小伙子,听前面的面试官说了,你Redis和消息队列都回答得不错,看来还是有点东西。
美丽迷人的面试官您好,您见笑了,全靠看了敖丙的《吊打面试官》系列,不然我还真的回答不上很多原本的知识盲区,他真的有点东西。
面试官心想:哦,吊打面试官是么,那今天我就让你知道,吊打这两个字怎么写的吧,年轻人啊,提前为你感到惋惜。
嗯嗯小帅比,虽然前面的技术栈没啥太大的瑕疵,不过未来很长的一段时间我会用一期期的基础教你做人的,你要准备好哟!
好了我们开始今天的面试吧,小伙子你了解数据结构中的HashMap么?能跟我聊聊他的结构和底层原理么?
切,这也太看不起我了吧,居然问这种低级问题,不过还是要好好回答。
嗯嗯面试官,我知道HashMap是我们非常常用的数据结构,由数组和链表组合构成的数据结构。
大概如下,数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。

因为他本身所有的位置都为null,在put插入的时候会根据key的hash去计算一个index值。
就比如我put(”帅丙“,520),我插入了为”帅丙“的元素,这个时候我们会通过哈希函数计算出插入的位置,计算出来index是2那结果如下。
hash(“帅丙”)= 2

你提到了还有链表,为啥需要链表,链表又是怎么样子的呢?
我们都知道数组长度是有限的,在有限的长度里面我们使用哈希,哈希本身就存在概率性,就是”帅丙“和”丙帅“我们都去hash有一定的概率会一样,就像上面的情况我再次哈希”丙帅“极端情况也会hash到一个值上,那就形成了链表。

每一个节点都会保存自身的hash、key、value、以及下个节点,我看看Node的源码。

说到链表我想问一下,你知道新的Entry节点在插入链表的时