个人情况:

某师范类大学网络工程专业本科毕业,这次秋招面试的是头条母公司字节跳动。接到面试通知以后,很早就到字节跳动总部了,整个园区的环境还是非常不错的,虽然面积不如BAT大厂,但设施还是非常齐全的,员工福利也很不错,食堂免费。废话不多说,特分享一下自己的面经。

 

一面(50分钟左右)

一面面试官看起来还是挺和蔼的,先让我做自我介绍然后他一边看我的简历。

问题列表

  • 我看你简历上写到了熟悉JVM虚拟机运行机制,你能给我介绍一下Java虚拟机运行时数据区域吗?

于是我就向他要了张草稿纸,把运行时区域画了下来比较全面地讲了一遍,并且把Java虚拟机中的一些东西和底层操作系统中的东西作了以下对比,后来面试官点了点头,就问下一个问题了。

其实我对Java虚拟机还是蛮熟的,看了很多关于这方面的知识。平时在学习的过程中也写了不少关于这个的博客。

  • 我看你对虚拟机挺了解的啊,垃圾回收你了解吗?给我讲讲

我先讲了下内存布局中的新生代、Survivor区域以及老年代的划分,然后讲了下对象动态年龄判断、分配空间担保等。接着从引用计数法开始讲,后来我说虚拟机中一般都不会用这个垃圾回收算法了,然后面试官打断了我让我直接从可达性分析开始介绍。我又把GC Roots的判定,哪些对象可以作为GC Roots、G1垃圾收集器的回收过程等讲了一遍。面试官看起来比较满意,就没继续深入地问虚拟机相关知识了。

在这里要强烈安利一本关于垃圾回收算法的书,是一个日本作家写的——《垃圾回收的算法与实现》。

  • 你说你阅读过某些主流WEB框架的源码(Spring IoC和AOP),那么你告诉我IoC中会有AOP吗?

额...之前还这没想过这个问题,因为这两部分我当时都是分开来看的,并没有总结它俩之间的联系。后来我说AOP中要生成代理对象,而由于控制反转的存在,代理对象的生成以及其生命周期的管理工作肯定是需要IoC容器来完成的,所以我觉得它俩之间有一衣带水,紧密相连的关系。

  • 那好吧,你说说看BeanFactory和FactoryBean有什么区别?

我说BeanFactory定义了IoC容器最基本的形式,相当于在Java语言中的Object一样,是所有IoC容器的基类。我们在实际进行框架开发的过程中不会直接拓展BeanFactory,而是用它的子类DefaultListableBeanFactory。然后我在描述FactoryBean的时候不知道怎么组织语言,说了一堆之后面试官说:你这说了等于没说嘛。后来还被吐槽到底有没有认真看过源码。我晕...后来面试结束之后我觉得应该把FactoryBean描述为类似于一个工厂方法中生成对象的一个东西。

  • AOP中动态代理的实现机制你了解吗?给我说说原理。

一开始我以为面试官直接让我说底层实现机制,稍微讲了下JDK动态代码实现方式我就开始讲它的源码了,后来面试官说没让我说源码,只是看下我知不知道怎么用。然后我就把JDK动态代理以及CGLIB动态代理讲了一下。

  • 你说你熟悉Mysql,讲一讲吧

这里讲了一些很基本的东西,包括ACID、隔离等级、Myisam和Innodb两种引擎、Innodb索引的底层实现(b+树)、b+树的原理、然后拓展地讲了下b树和b*树,说了它们的优势劣势。在我后面讲项目的时候还提到了封锁协议以及封锁等级等等。

  • 你这个秒杀系统还挺有意思的,我们来说说这个吧

网购模拟秒杀系统是我之前学习了大型网站架构以及系统优化相关知识之后动手实现的一个小Demo。面试的时候谈了很多关于系统优化、并发削峰以及流量控制、数据冷热备份的问题,这里不详细讲了。感兴趣的同学可以买下面这两本书来看看。

后来面试官就说可以了,然后让我过十分钟去前台问有没有面试。因为感觉一面表现蛮好,我就找了个地方又把项目代码看了一遍,因为怕二面深入地问项目。

二面(20多分钟)

二面真的是非常迷.....因为全程都在问算法题......

  • 你做个自我介绍吧,我先看下一面面试官对你的评价。
  • 一个链表,求中间结点

第一题还挺简单的,leetcode上很多和链表有关的题目都会用到这个,很快就写出来了。

  • 有两个int类型的数a和b,你能写出几种交换它们值的办法?越多越好

中间变量、异或、用两数和加减运算(这里可能会发生整形溢出)

  • 一个1TB的文件,你有什么最快的办法能够求出重复次数最多的TOP5行数据?

这题答得不好。。

  • 给你1到100万的连续整数,我从中取出一个数然后打乱数组,你给我求出被取出的是什么数。这题真的很迷。。我一开始说排序之后遍历,他说达不到他的要求,于是我就知道想要时间复杂度为O(n)的答案。我就一直在往二进制异或之类的方面靠,后来还是没答出来。结果今天早上突然想到一个用高中知识完全可以解决的办法:用等差数列求和公式求出1到100万的和,然后再一一减去数组中的数字,就可以求出被取出的数了。

二面之后心里十分的忐忑,心想肯定得GG了,结果去前台问了下说还有hr面。

HR面

hr面就比较轻松了,就像聊天一样。

  • 做个自我介绍吧(主要是校内生活、竞赛经历、奖学金、学生干部、辩论队、专业学习等)
  • 你是网络工程专业的学生,其实培养方案不太侧重软件开发吧?说说你平时都是怎么进行自学的啊?
  • 为什么不考研?
  • 之前投过其他公司吗?
  • 这几个项目中你主要承担什么角色?
  • 如果拿到了offer什么时候可以来实习?

 

以上就是字节跳动的整个面试过程,另外我还将其他一线大厂的面试真题整理成文档的形式,还包括自己搜集到的一些专题面试真题,如果有需要的看这里哦