字节跳动面试官问我看过哪些源码,然后就没有然后了
最近,我的一位朋友在找工作,已经拿到了美团、快手等公司的Offer,准备选择其中一家入职了。
后来他又接到了字节跳动的电话,通知他去参加三面。从二面到三面之间隔了挺久的,他以为都没戏了,结果就收到了通知。
由于已经拿到了很多大厂的Offer,他对这次面试还是挺有信心的。但是回来之后,表现的特别沮丧。
一问之下,原来是面试官问的一些问题他回答的不好,他说面试官揪着源码一直问,但是自己并没有深入看太多的源码,所以回答的不是太好。
他给我总结了一下面试官关于源码部分的问题,主要题目如下:
1、你看过那些源码吗?
2、那你能讲讲HashMap的实现原理吗?
3、HashMap什么时候会进行rehash?
4、HashMap什么时候会进行扩容?
5、那HashMap的初始容量设置成多少比较合适呢?
6、结合源码说说HashMap在高并发场景中为什么会出现死循环?
7、JDK1.8中对HashMap做了哪些性能优化?
8、HashMap和HashTable有何不同?
9、HashMap 和 ConcurrentHashMap 的区别?
10、ConcurrentHashMap和LinkedHashMap有什么区别?
11、为什么ConcurrentHashMap中的链表转红黑树的阀值是8?
12、什么是ConcurrentSkipListMap?他和ConcurrentHashMap有什么区别?
13、还看过其他的源码吗?Spring的源码有了解吗?
14、SpringBoot的源码呢?知道starter是怎么实现的吗?
以上,就是我这位朋友被面试官血虐的过程。全程围绕源码展开。除了他以外,其实还有很多人在面试中也被深入的问过很多源码问题。
如下面这两位:

那么,为什么面试官这么喜欢问源码?作为面试者你又为什么需要看源码呢?

难道是为了面试吗?我觉得不是!我觉得看源码有以下几个好处:
1、可以从源码中学习
比如我们看JDK的源码,其中会有很多关于性能优化、防并发的例子,还有很多地方用了设计模式,这些都是很好的可以用来学习的代码。
对于初学者来说,很多代码格式、命名等都是需要学习的,最好的办法就是通过开源代码来学习。
2、深入源码才能懂得原理
有的时候,我们使用的第三方的框架,中间件等,我们要想了解他们的原理,最有效的办法就是直接看源码。源码是不会骗人的。
3、更好的解决问题
只要是人写的代码,就可能存在bug,别人的开源代码也一样,通过阅读源代码可以更好的定位和解决问题。
4、为了找工作
为什么面试官喜欢问源码,因为这能提现一个面试者是否爱钻研,是否愿意深入原理。而企业需要的恰恰是这样的人!
如何学习源码呢?有几点建议:
1、先从全局出发
不要一上来就直接进入到细节,先通过文档、代码结构、架构分层等方面入手,大概了解一些各个模块的代码都是什么功能。这样在后续深入学习的时候可以刚加便于理解和查找响应代码
2、从问题出发
深入学习之前,最好带着一个问题,比如学习HashMap的源码时候,你带着问题『什么时候会进行rehash』,这样你就可以围绕自己的问题逐渐的深入展开。从点到面,逐步扩展。
3、面向debug学习
在源码学习过程中,也可以通过调试的方式学习,这样可以更好的查看代码调用过程,执行情况,运行时变量等。更加方面理解。
4、做记录
最后,要勤于记录,把自己遇到的问题和思考记录下来,方面后面再次复习和查看。
好了,希望大家都养成阅读源码的好习惯,也希望大家遇到所有源码类面试题都可以轻松搞定。
最后,给大家推荐一些免费的源码学习的资料,来自网易,免费领取。
- sphinx索引部分源码续——过程:连接到CSphSource对应的sql数据源,通过fetch row取其中一行,然后解析出field,分词,获得wordhit,最后再加入到CSphSource的Hits里
- GitHub 上有哪些完整的 iOS-App 源码值得参考?
- acm 2037 水题一个 注意细节- - 然后 没有然后了
- 考上好大学,然后进入IT行业是穷人孩子晋级中产的唯一出路?(好多年不转载别人的文章了,本文的话题是我非常关注的,一直没有写)
- vs2010中的错误错误C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型和Unicode字符集和多字节字符集关系
- 解决“在多字节的目标代码页中,没有此Unicode字符可以映射到的字符”
- MyEclipse下如何安装和使用ibatis插件(网上的资料对于myeclipse8.5根本就是没有用的,所以我还是自己选择了装了一个eclipse,然后将插件装在了eclipse中)
- 【MyEclipse】我们导入的jar包后, 一般没有关联源码, 需要手动进行关联!推荐这种方式。
- 完成系统登录程序,从命令行输入用户名和密码,如果没有输入用户名和密码,则提示输入用户名和密码;如果输入了用户名但是没有输入密码,则提示用户输入密码,然后判断用户名是否是mldn,密码是否是hello,
- 字节跳动今日头条笔试题目经历2018
- 编译android内核源码然后用真机运行
- 查看mysql实例中哪些表没有主键/哪些表有主键
- Linux系统编译boost源码,然后和Qt Creator配套使用
- 邱嘉文老师那篇《从软件的“胚”谈到模型的参照系》,已经看过两遍了,感觉还是没有理解。
- Maven下的Spring mvc项目中没有spring源码
- “由于网络上有重名,没有连接。请到“控制面板”中的“系统”更改计算机名,然后重试”解决办法
- 将jar包添加依赖后如何自动导入源码:解决不是maven官网提供的依赖,添加依赖后没有源码,使用反编译工具解决!
- 用git commit提交版本时没有加-m,会进入vim,如何写入提交说明然后退出
- 热更新如果是android平台的话,可以直接.cs文件到本地,然后使用反射进行加载。 如果是IOS平台的话,就没有办法直接更新.cs文件了,可以使用ULua进行搞定。
- 为没有源码的程序集添加强名称(strong name)