微信公众号:大黄奔跑

关注我,可了解更多有趣的面试相关问题。

写在之前

毫无疑问,回想2020年有什么词出现在眼前最多的,无疑是"996"和"内卷",从马老师的福报论、到年底pdd刚毕业员工猝死,内卷从此从最初谈论于学者文章中出圈了,之后一发不可收拾,几乎能贯穿整个2020年所有的热点时间,大部分事情都可以套用一句:"卷就完事儿了"!



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

而作为互联网中从业人员,无论是找工作还是工作中,处处透漏着卷。关于卷深层次含义及社会含义,大黄才疏学浅,这里就不班门弄斧了。

本文主要目的从互联网从业人员角度,从就业的过程中,简单分析"内卷"的情况。

从HashMap面试聊开

曾几何时,关于HashMap面试一般都考察的比较简单,大概是你知道有这么回事儿就可以通过,通俗讲,能够回答出是什么面试就妥了。

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

HashMap底层数据结构是什么?

初级版本:你能回答出HashMap是数组+链表+红黑树实现的,大致就满足要求了。

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

中级版本,已经不再是简单的是什么的问题了,而是开始追求是什么和为什么了。

面试官:数组的初始长度是多少?

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

面试官:为什么需要采用链表呢?

打工人:当某个位置的key发生hash冲突时,则开始用链表来存储,也就是用数组+链表来存储元素。在每个数组元素上都一个链表结构,当数据被Hash后,得到数组下标,把数据放在对应下标元素的链表上

面试官:那为什么又需要用红黑树呢?

打工人:当链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。

按道理,能够回答到这里已经够可以了吧,但是突然有一天,面试官发现好像所有人能够回答到这个程度,怎么办,这就没有办法挑选人了。人多了怎么办?那就加大力度咯。

内卷版:当问题到了这个程度,有时候想想也挺悲剧的,到了一种为了问问题而问问题阶段。

面试官:你刚才说数组初始默认是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的程序员,咱们下期见。

从HashMap面试聊聊互联网内卷的更多相关文章

  1. 记一次HashMap面试

    记一次HashMap面试 从网上已经身边同事朋友的面试情况来看,面试HashMap几乎是必问的,网上也很多类似的文章,但是真面起来,发现还是有很多点可以深抠的.本篇就结合一次面试经历说一下之前没有注意 ...

  2. involution 内卷化

    involution 内卷化 虽然不熟悉 involution,但是我想起另外两个常用词:evolution(进化)和 revolution(革命). 它们共同的词根volute,拉丁语原意是&quo ...

  3. HashMap面试知识点总结

    主要参考 JavaGuide 和 敖丙 的文章, 其中也有参考其他的文章, 但忘记保存链接了, 文中图片也是引用别的大佬的, 请见谅. 新手上路, 若有问题, 欢迎指正. 背景 HashMap 的相关 ...

  4. 一万三千字的HashMap面试必问知识点详解

    目录 概论 Hasmap 的继承关系 hashmap 的原理 解决Hash冲突的方法 开放定址法 再哈希法 链地址法 建立公共溢出区 hashmap 最终的形态 Hashmap 的返回值 HashMa ...

  5. .net程序员面试小结(内附一些面试题和答案)

    今天下午去面试,面试官和HR小姐姐都很好,没有做面试题,用聊天的方式来交流技术,整个过程很轻松,从中也学到了很多知识. 下面就来总结一下面试过程. 一.深刻了解自己的简历 无论是HR还是技术面试人,首 ...

  6. 聊聊Docker数据卷和数据卷容器

    当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持, [数据卷] 文件是数据持 ...

  7. HashMap面试知识点

    HashMap的工作原理是近年来常见的Java面试题. 几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如 ...

  8. 【Linux-CentOS】在无互联网-内网环境的Windows7主机上安装CentOS双系统,从安装到放弃

    2018.12.3 日更新:本文仅作为无互联网环境下安装的参考.更推荐在互联网环境下安装软件和使用系统,毕竟会自动安装依赖包,比较方便. 因个人办公电脑装的盗版Win7总是蓝屏,影响工作,加之看到 W ...

  9. 你不得不知道的HashMap面试连环炮

    为什么用HashMap? 简述一下Map类继承关系? 解决哈希冲突的方法? 为什么HashMap线程不安全? resize机制? HashMap的工作原理是什么? 有什么方法可以减少碰撞? HashM ...

随机推荐

  1. 并发队列:ArrayBlockingQueue实际运用场景和原理

    ArrayBlockingQueue实际应用场景 之前在某公司做过一款情绪识别的系统,这套系统通过调用摄像头接口采集人脸信息,将采集的人脸信息做人脸识别和情绪分析,最终经过一定的算法将个人情绪数据转化 ...

  2. MIT 6.S081 聊聊xv6中的文件系统(上)

    前言 Lab一做一晚上,blog一写能写两天,比做Lab的时间还长( 这篇博文是半夜才写完的,本来打算写完后立刻发出来,但由于今天发现白天发博点击量会高点,就睡了一觉后才发(几十的点击量也是点击量啊T ...

  3. Effective Java读书笔记--对所有对象都通用的方法

    1.覆盖equals请遵守通用规定.不需要覆写equals的场景:a.类的每个实例都是唯一的.b.类不需要提供"逻辑相等"的测试功能.c.超类已经覆盖了equals的方法.d.类是 ...

  4. 漫画 | CPU战争40年,真正的王者终于现身!

    上个世纪70年代,内存又慢又贵, 程序员得想尽一切办法节省内存. 那个时代的编译器也比较差劲 所以,70年代的程序员几乎都写得一手好汇编. 为了帮助程序员写好汇编,这个时候的CPU也有意把指令集做了增 ...

  5. vector的几种初始化及赋值方式

    转自https://www.cnblogs.com/quyc/p/12857054.html (1)不带参数的构造函数初始化 //初始化一个size为0的vector vector<int> ...

  6. hdu 4738 Caocao's Bridges(割边)

    题目链接 用tarjan求桥上的最小权值 #include<bits/stdc++.h> #define ll long long int using namespace std; inl ...

  7. Codeforces Round #658 (Div. 2)【ABC2】

    做完前四题还有一个半小时... 比赛链接:https://codeforces.com/contest/1382 A. Common Subsequence 题意 给出两个数组,找出二者最短的公共子序 ...

  8. cf1291c-Mind Control

    题意:n个数n个人依次取数,每个人只能取第一个数或最后一个数,你可以从一开始控制k个人取最前边或是最后边的数,你排在第m位,能取到的最大的数是多少.所有人取数都是最优策略(不是每次取最大数). 题解: ...

  9. 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛) C.Coronavirus (BFS)

    题意:有一个图,要求从\(S\)走到\(E\),\(.\)表示可以走的路径,\(*\)周围的八个方向均不能走,要求判断是否能走到\(E\),若能,输出最小路径长度,否则输出\(Impossible\) ...

  10. Nacos学习与实战

    1. 什么是Nacos 官网:https://nacos.io/zh-cn/index.html Nacos是阿里巴巴集团开源的项目,Nacos 致力于帮助您发现.配置和管理微服务. Nacos提供了 ...