前言
从 2020 年 11 月开始面试准备到 2020 年最后一天收到短信 Offer,历时两个月。在面试边缘疯狂试探的我,终于等来了梦寐以求的字节跳动 Offer。
对于这次经历,希望能分享给大家,希望对大家有借鉴意义和帮助。2 个月的时间总共面试了 9 家公司(2 小,4 中,3 大厂),小的都拿下了,4 中里 3 个一轮游,1 个三轮游,3 个大厂最后拿到了字节的 Offer,阿里的一面就挂了,腾讯的到了三面。
大小厂的面试要点简要
小公司会比较偏重于业务,面试上也偏重业务(但也少不了算法题,字节每轮必问),比如做了什么,大概方案,用了哪些库,库的原理。这些基本上会集中在图片处理、网络封装、自定义 View 这几个部分。
大厂会从业务入手,递进深入到原理及相关知识点,尤其集中在原理部分,这里对平时源码阅读有一定要求。或者直接问对 xxx 源码有没有了解。比如一个 Handler 机制,因其涉及的地方特别多而且很容易展开,想完美答好,真的不是一次两次就能行的。
建议每次面试完,都及时对面试内容进行回忆记录。当前这里不是为了泄题漏题,目的是进行复盘,打磨自己的回答。这也是我为什么在面试大厂之前会先去小、中场先去试水以及写下这篇面经分享的原因。其实在前半个月我就已经面完了 6 个小、中场,也正是在中厂这环节的挫败,让我余下的一个多月都在做复盘、查漏补缺,为面试大厂做准备。
简历书写
强烈建议,把自己的强项、亮点加粗注明放在简历前面,大家都很忙,也很烦躁,让人一眼就看到优点,对双方都友好。因为我对 Android 性能优化方面感兴趣,平时工作也花了很多时间在这里,所以我会在简历上突出说明,我做了内存优化,熟练掌握使用 xxx,内存性能提升 xxx(因为这里的内容是可控的,如果面试官对你感兴趣,这里的回答你也是能提早准备好的)。
项目经历如何写?建议按照是什么,做了啥,有啥数据指标佐证的方式去写。比如,我做了 xx 项目,负责 xx 模块,使用了 xxx 框架,可配合 xx 做 xxx,效率提高 xxx% 这样子。
以上仅为自己的个人经验,仅供参考,接下来给大家分享下我的字节三面技术面和腾讯三面的面试题分享(阿里一面就挂了,就不献丑了)。
字节一面
- 先聊简历。
- 聊性能优化方面的问题,我这边体系化展开讲卡顿、瘦身、内存、Crash 等方面的优化经验。
- synchronized、volatile 区别? (这里可以体系化的回答,主要从 JMM 角度去回答,最后深入到字节码层面的区别。因为提到了修饰的范围有差别,就有了下一题。)
- 对于锁的对象的不同,效果会有什么差别。
- 讲一下 Handler 机制。 (这个问题问得太多了,一定要去看一回源码。重点答的是 MessageQueue 这块,包括什么时候空闲,阻塞。发散讲了线程相关的 ThreadLocal,还有 IdleHandler)
- 出了一个设计题,当你的服务商出现问题,设计一个网络请求可用性的兜底方案。 (大概从 HttpDNS,域名容灾等方面回答吧。)
- 设计一个方案,APK 已经发出去了,Java 代码是最新,但是分包下发的 SO 文件是旧版本,如何做一个兼容方案,保证兼容可用。 (这里没答好,我也忘了怎么答的了。)
- Java 类加载机制。 (这是个基础概念题,没答好,回答的双亲加载机制。然后引出 PathClassLoader,DexClassLoader 的区别,一个 dex 的加载到一个 java 类的加载过程。)
- 一道算法题。
字节二面
- 聊简历。
- 性能优化,展开讲了卡顿、内存。
- 数据结构的题,hashCode 的扰动算法,涉及到一个数字,31,这个 31 是怎么来的?
- 类的 static 属性字段,比如 public static int a = 1,被赋值几次? (这个需要对类的加载机制有了解。)
- 多个 Activity 共同 bind 一个 Service,一个 Activity destroy,问 Service 的情况。 (这里就是问 Service 的生命周期,考察 bind 跟 start 的区别。)
- 装饰器模式,跟代理模式的区别。 (考察对常用的设计模式)
- OkHttp 的缓存逻辑实现。 (我以为是问的链接缓存跟 IO 缓存,我回答的是连接池复用跟 Okio 的 IO 复用。后来提醒是 Cache,就回答 CacheInterceptor,及其源码实现。)
- SharedPreferences 的 commit、apply 区别。
- SharedPreferences 的性能问题。 (apply 的 ANR 是有一个字段,会 block 住主线程,需要清理 queuedWork 队列。)
- SharedPreferences 线程安全性,还有是否进程安全,SharedPreferences 锁的对象是谁?
- synchronized 锁对象,汇编实现。volatile 的汇编实现。
- volatile 修饰 boolean 能保证原子性么?
- Android 有哪几种动画。
- 设计题,设计一个埋点数据上报库,需要哪几个模块,提供哪样的接口。


