记一次面试过程

363 阅读4分钟

看完点个赞呗,啊呜~

面试过程

  某年某月某日,小王起了个早,开始准备去面试。

  刚到面试地点,就看到人群排起了长队。“人还真不少,不知道能不能拿下这个offer。”小王心里想到。

  小王刚找到一个位置准备坐下,就看到远方一个猥琐的笑脸,一边笑还一边朝他挥手,嘴里喊着“小王,小王,这里。”

  小王定睛一看,“我擦,老王怎么在这里”,小王心里一万个草泥马奔过。

  小王不情愿的向老王走去,走到老王眼前问道:“老王,你怎么在这里?”

  “哦,我是来看你嫂子的。”老王回答道

  “哪个嫂子?我怎么不知道这里还有我嫂子?”

  当老王刚要回答小王的时候,就听到面试官喊:“编号9527,该你进去面试了”

  “好的,这就来”,“老王,我先去面试了,等会再聊”

  “嗯嗯,你先去面试吧,刚把得(这是加油的意思)”,小王听到老王这一句加油,心里一阵恶心,赶紧跑进面试房间。

  刚一进面试房间,就看到面试官坐在对面的椅子上,右边有一个记录员,左边有一个辅助面试的妹子,长得还算可以。

  接下来小王就开始聊做的什么项目,用到什么技术,遇到的技术难题,是如何去攻克的巴拉巴拉。

  聊完之后,面试官只是低头翻着简历,无人说话,场面一度尴尬。

  “这不行啊,再这么尴尬下去估计就挂了”小王心里想到。

  于是,小王又说到:“我还精通HashMap,阅读过源码”

  小王刚说完,面试官就提起头看向小王,然后说道:“那你说说JDK1.8前后HashMap有什么区别?”

  “JDk1.8之前HashMap采用的数据结构是数组+链表,而1.8之后是数组+链表+红黑树” 小王回答道。

  “那你说一下get方法是如何根据这个key获取value的?”

  “是通过getNode这个方法来获取Node对象,这个Node是实现了Entity<K,V>的,而getNode接收一个hash值(key进行hash操作的值)和key,然后把这个hash值与n-1(数组长度-1)进行按位与操作,防止角标越界,根据这个hash找到位桶的位置,然后判断key是否相等,相等的话取出对应key的value。”

  “那你说一下这个Hash值是如何计算出来的?”

  “这个hash值跟通过hash操作得到的值与该key的高16位做异或操作得到的,也就是取模运算”

   面试官逐渐提起兴趣,继续问小王。

   “为什么手动初始容量要用2的n次幂?随便填写几个数字不行吗?”

  “因为当容量为2的倍数的时候,进行hash运算时,二进制能够更好的保留位数,散列均匀,减少hash碰撞”

  “那你继续说一下hash碰撞时该怎么办?”面试官继续问道。

  “当得到的hash碰撞时,会调用equals方法,获取和存储想要的值。”小王回答道。

  “说一下转红黑树的条件?”

  “当阈(这个字读yu)值>8 &&<64的时候,会将这一条单向链表复制一份,转换为自平衡二叉树。”

  “嗯,不错,你简单说一下put方法注意的地方吧”

  “put方法最核心把key做hash操作,然后判断该hash位置有没有值,没有添加,有的话,调用equals方法,key相同覆盖,不相同添加,然后就是判断该不该转红黑树,是否需要扩容”

  “好,你的情况大体上我已经了解了,你还有什么想问我的吗?”面试官问道。

  “贵公司有程序员鼓励师吗?” 小王好奇的问道。

  于是乎,小王 猝。

总结

  以上便是小王一次面试的全部内容,感谢大家的阅读。天高地远,我们江湖再见!