看完点个赞呗,啊呜~
面试过程
某年某月某日,小王起了个早,开始准备去面试。
刚到面试地点,就看到人群排起了长队。“人还真不少,不知道能不能拿下这个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相同覆盖,不相同添加,然后就是判断该不该转红黑树,是否需要扩容”
“好,你的情况大体上我已经了解了,你还有什么想问我的吗?”面试官问道。
“贵公司有程序员鼓励师吗?” 小王好奇的问道。
于是乎,小王 猝。
总结
以上便是小王一次面试的全部内容,感谢大家的阅读。天高地远,我们江湖再见!