背景
唠叨一下:先讲一下我的职业生涯哈,不想看的可以直接到最后一段。我是普通二本出身,一直飘在北京,先是做web网站开发,后转到了Android移动端,也没有什么好运气,就靠一点小机智,得过且过混到16年初,靠着移动互联网大浪把我推到了一家二线互联网企业,在这里才算真正重构了自己,感谢当时遇到的同事,以及有可以和公司一起成长的机会,先后经历了完整的插件化和RN重度封装,知道了虚拟机和Android源码的重要,并开始积累。
18年初,由于公司内部重大调整,动荡不安,再加上自觉jvm和framework很溜了,于是开始看机会,寒冬初期也还算是顺利吧,进了一家普通的一线,可是没想到真正的大厂弯弯绕这么多,激烈,效率如此之低,不是嫡系,你不仅少有升职加薪的机会,连好的项目都拿不到,这个时候迷茫了,大厂也算进来了,结果却如此令人失望。
还得多写一些博主们的文章对我进行引导,这时才明白了一点,知识特别是你本专业的知识,才是安身立命之本,是你最好最快的赚钱方法,读了多少年的书中自有黄金屋,这刻才算真正领悟吧,于是用三个月逐渐修补自己最后的短板:开源库和算法,过程中,逐渐拿各细分行业的小独角兽练手,最后一次就搞定了字节,很顺利。以上就是我的唠叨和感慨,进入字节对于很多985研究生毕业的人来说,是件不太难的事情,可是对于普通人来说,还是个梦想,所以我稍微记录一下心路历程,给别人以参考。
字节面经过程
一面(40min):
- a. 线程池的底层原理
- b. 四种引用类型
- c. JAVA GC
- d. Sychornized关键字
- e. 静态同步函数
- f. 可不可以调用Abstrut 父类的super方法
- g. HTTP协议中POST,GET 的区别
- h. TCP/IP协议栈 i. TCP和UDP的区别
- j. 三次握手是什么?可以两次握手么
- k. 进程和线程的区别
- l. 手写ViewGroup树结构遍历
第一次面试稍微有些紧张,但总体来说发挥还是OK的
二面(1h):
- a. ArrayList / LinkedList的区别
- b. HashMap的底层实现原理
- c. 两个线程分别调用同一个类的实例函数和类函数
- d. 什么是可见性?举例场景
- e. volatile关键字的意义
- f.Class对象
- g. 线程结束的方法:Interrupt之后需要做什么
- h. Android Activity切换生命周期
- i. Activity保存状态的函数
- j. 子线程对UI的操作方法
- k. 如何在应用程序远程调用中表明用户身份
- l. 单例模式、建造者模式、中介模式
- m. 手写中位数查找算法
中规中矩,就是Activity回答的不是很好
三面(50min):
- a. 聊聊项目
- b. Handler和Looper的底层结构
- c. postRunnable方法的底层实现
- d. Thread Run和Start的底层调用区别(是否中断陷入)
- e. BroadCast的使用方法
- f. Intent的使用方法
- g. Intent-Filter
- h. 手写外部排序
由于之前还有做过一些项目,这关单纯就是我的加分项目了
上面就是我大致的一个面试过程,能记得的面试内容就这些了,其实面试中问道的还是有很多,问的都比较全面,主要都是从自己简历上填写的项目经历问过去的,顺着还延伸的问了一些。我知道面试官主要是想要考考我的技术水平,还好面试前自己有进行知识点梳理,中间只是出现了一点点小失误,是自己对那些知识点掌握的不够,但没有对我的面试结果收到太多的影响,最后还是把Offer拿到了手。
所以大家在面试前先要对自己的简历进谨慎的填写,并且要对自己填写的项目经历有较深的了解,这样面试官通过你的项目经历进行提问时,你可以顺利的答出。还有就是你在面试前可以去网上去收集一些往年常见面试题进行刷,也是防止面试过问些常见问题,这如果你没答上来就有点可惜了。因为常见面试问题一般在网上都是有参考答案,所以通过这些参考答案进行自我优化理解,等到做答时能够更好的顺口答出。
最后
我在面试前期做了一些面试准备,通过在网上收集和自己多年经验整理了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等进行了复习,这次面试中被问到的一些题,有部分我都有在这些学习文档中刷到,所以特此份享给大家参考学习,希望能帮助到大家学习提升,我已全部记录在了我 GitHub 。欢迎大家去star~