关于java:从HashMap面试聊聊互联网内卷

6次阅读

共计 2202 个字符,预计需要花费 6 分钟才能阅读完成。

关注我,可理解更多乏味的面试相干问题。

写在之前

毫无疑问,回忆 2020 年有什么词呈现在眼前最多的,无疑是 ”996″ 和 ” 内卷 ”,从马老师的福报论、到年底 pdd 刚毕业员工猝死,内卷从此从最后议论于学者文章中出圈了,之后一发不可收拾,简直能贯通整个 2020 年所有的热点工夫,大部分事件都能够套用一句:” 卷就完事儿了 ”!

互联网是目前绝大部分舆论社交暴发点的火山口,近几年蓬勃发展的互联网,带来的丰盛的社交形式,无论是文字交换模式的微博、知乎、微信以及视频模式的 B 站,造就了种种便当的同时,也沦为以后 ” 内卷 ” 话题的漩涡。

而作为互联网中从业人员,无论是找工作还是工作中,处处透漏着卷。对于卷深层次含意及社会含意,大黄满腹经纶,这里就不班门弄斧了。

本文次要目标从互联网从业人员角度,从待业的过程中,简略剖析 ” 内卷 ” 的状况。

从 HashMap 面试聊开

曾几何时,对于 HashMap 面试个别都考查的比较简单,大略是你晓得有这么回事儿就能够通过,艰深讲,可能答复出是什么面试就妥了。

从几个常见的面试问题管窥不同阶段的面试难度,面试是如何打工人内卷的修罗场。

HashMap 底层数据结构是什么?

<span style=”color: #FF0000; font-size:1.2em;”>高级版本</span>:你能答复出 HashMap 是数组 + 链表 + 红黑树实现的,大抵就满足要求了。

如果可能给面试官绘制如下这张底层结构图,那么祝贺你,可能会给人留下能力很强的印象。

<span style=”color: #FF0000; font-size:1.2em;”> 中级版本,曾经不再是简略的是什么的问题了,而是开始谋求是什么和为什么了。</span>

面试官:数组的初始长度是多少?
打工人:数组初始默认是 16,负载因子为 0.75,也就是说每次元素个数达到 容量 * 负载因子 时则开始扩容。

面试官:为什么须要采纳链表呢?
打工人:当某个地位的 key 产生 hash 抵触时,则开始用链表来存储,也就是用数组 + 链表来存储元素。在每个数组元素上都一个链表构造,当数据被 Hash 后,失去数组下标,把数据放在对应下标元素的链表上

面试官:那为什么又须要用红黑树呢?
打工人:当链表长度太长(默认超过 8)时,链表就转换为红黑树,利用红黑树疾速增删改查的特点进步 HashMap 的性能,其中会用到红黑树的插入、删除、查找等算法。

按情理,可能答复到这里曾经够能够了吧,然而忽然有一天,面试官发现如同所有人可能答复到这个水平,怎么办,这就没有方法筛选人了。人多了怎么办?那就加大力度咯。

<span style=”color: #FF0000; font-size:1.2em;”> 内卷版:当问题到了这个水平,有时候想想也挺喜剧的,到了一种为了问问题而问问题阶段。</span>

面试官:你方才说数组初始默认是 16,为什么必须是 16,而不是 15 或者其余的数呢?

这个问题你说他有价值吧,必定是有的,最后 HashMap 设计者必定是处于性能思考抉择 16,然而总有一种偏离了面试的初衷。

打工人小卷:HashMap数组初始容量采纳 16,次要是为了在取模和扩容时做优化,同时为了缩小抵触,HashMap定位哈希桶索引地位时,也退出了高位参加运算的过程。比方扩容时从新计算 hash,只须要看看原来的hash 值新增的那个 bit 是 1 还是 0 就好了,是 0 的话索引没变,是 1 的话索引变成“原索引+oldCap

面试官:小样,还难不倒你了。。链表太长(超过 8),则将链表转化为红黑树。为啥不间接应用红黑树呢?

打工人小卷看着仗势,搬出来本人看源码的精力。

源码中明确写到:” 因为树节点的大小是链表节点大小的两倍,所以只有在容器中蕴含足够的节点保障应用才用它”,显然只管转为树使得查找的速度更快,然而在节点数比拟小的时候,此时对于红黑树来说内存上的劣势会超过查找等操作的劣势,天然应用链表更加好。

然而当节点多的时候,红黑树查问一个元素工夫复杂度为 O(logN),而链表工夫复杂度为 O(N),整体看节点多时红黑树性能更高。

面试官:那为什么是 8 的时候转,而不是 9 或者其余数值呢?

好家伙,这个我真的没有思考过,然而您先别着急,万事不决,问 JDKjdk 源码中还真的有写。原文如下:

简略一句话是:作者做了大量的测试发现,在随机哈希码下,哈希表中节点的频率遵循 泊松散布(不分明为何物的自行百度哈),而依据统计,疏忽方差,当长度为 8 的时候,再呈现哈希抵触的概率曾经很小了(千万分之一),再往后调整并没有很大意义。

总结

一个 HashMap 的底层数据结构就能被挖出这么多 ” 深层次 ” 的货色,被开掘进去的货色必定是好的,至多阐明了学习严谨性。至于说这种面试有多大的价值,我这里不做过多评估,然而我自己持有保留意见。

当初很多人评估面试说的很好:八股文面试,万物皆可套路。原本一个问题能答复出是什么、有什么用、为什么如此,我感觉就能够达到通过的阶段。然而面对一直融入新人(当然我也是其中一员),招人需要端人数趋于稳定,供大于求,对于需要端如何挑选出更加 ” 优良 ” 的人才是一个难题,对于供应端如果给他人呈现出更好的 ” 妆态 ” 又是一个难题。供需不均衡或者说生产力不解决,找工作内卷只会日益严重。

你看,我这篇文章也是一种内卷的体现。

番外

另外,关注大黄奔跑,第一工夫播种独家整顿的面试实战记录及面试知识点总结。

我是大黄,一个只会写 HelloWorld 的程序员,咱们下期见。

正文完
 0