不少同学对字节的面试有所忌惮,不愿轻易尝试。其实字节尤其是客户端的面试并没有大家想象的那么难,今天分享一篇面经,内容真实,希望帮助大家更好地了解抖音安卓客户端面试的出题范围和难度。
下面是我在抖音Android客户端的面经分享,一、二、三面和 HR 面都是凭印象回忆的,可能会漏掉一些问题。
1. 自我介绍
2. 简单讲讲你项目的整个设计过程
3. 你提到项目中用的是 MVVM 架构,讲讲你对 MVVM 的认识?
4. 你有提到说用的 Kotlin,那讲讲 Kotlin 用起来相比 Java 的好处?
5. 浏览器里从输入一个网址,到最终看见网页,发生了什么?
6. 算法
零钱兑换 II
题目开始理解错了。最后这个题没完全做出来,面试官让我讲了下思路。
7. 反问
一面结束后等了十几分钟,HR 通知第二天二面。
1. 自我介绍
2. 项目介绍。用到了什么技术栈?
3. Kotlin 和 Java 都是在做这个 Android 项目中学习的吗?
4. Kotlin 的作用域函数(let、apply 等)有了解过吗?
5. OOP 中的设计模式有了解过吗?
6. Jetpack 的其他组件有了解过吗?
Room 使用的基本流程了解吗?
7. 算法
8. 反问
二面结束之后等了大概一个小时多,HR 通知第二天三面。
1. 自我介绍 & 项目介绍
2. 有了解过 Retrofit 是如何简化网络请求的吗?
3. Retrofit 会结合一些注解进行使用,对注解有什么了解吗?
4. Jetpack 的 AAC 中是如何做到生命周期的分发的呢?
5. Compose 有了解过吗?
最开始没想起来,后来面试官提到 Flutter 才想起来是新出的一个声明式 UI 框架。
6. Flutter 有了解过吗?
7. synchronized 关键字修饰静态方法和非静态方法的区别?
8. volatile 关键字的作用?
9. Java 中的四种引用类型有了解过吗?
10. GC 机制有了解过吗,比如算法之类的?
11. 一个 View 要渲染出来,需要经过哪几个步骤呢?
这些步骤各自对应了一个回调方法,对 View 的什么操作会触发对这些回调方法的调用呢?或者说,不同的操作会触发不同的调用吗,比如有的调用,有的不调用?
除了在 Activity 创建的时候,后续对 View 的哪些操作会触发这些回调方法呢?(这里确实没复习到,现场通过 TextView 举例结合了这三个阶段的回调方法名开始猜)
12. 除了绘制,View 还有一些事件的传递机制,有了解吗?
13. 有听说过“过度绘制”吗?
这个没答上来,然后面试官很耐心地解释了这个概念,实际上就是两个 View 叠在一起,下层被上层挡住的部分是看不见的,但还是会进行绘制。
14. 编程 & 提问
给一个 List<string>,遍历并删除指定元素(比如 abc),写出代码(大概就是自己实现 List#removeAll())。</string>
三面不出算法题是我没想到的。这个题也挺简单,就是利用迭代器遍历然后删除就好。
因为对迭代器不是特别熟悉,所以开始写的时候并没有单独用变量 it 把迭代器存下来,而是在每个要用迭代器的地方都获取了一次,然后跑起来报错了。后来意识到之后就改了。
List<String> list = new ArrayList<>(); list.add("abc"); list.add("abc"); list.add("abc"); list.add("123"); list.add("abc"); Iterator it = list.iterator(); while (it.hasNext()) { if (it.next().equals("abc")) { it.remove(); } }
然后面试官从代码规范和迭代器的使用两个角度讲了一下为什么应该把迭代器提前存到变量里面,还提到了 WeakReference 相关的东西。
一紧张没敢确定说是 Fast-fail,面试官允许我先运行了一下再说。
15. 反问
三面结束后一个多小时左右,收到了晚上继续 HR 面的通知。
1. 评价一下自己前三面的表现?
2. 介绍一下你的项目
3. 项目中遇到瓶颈是怎么解决的?
4. 你觉得你这个项目对你有什么提升?
5. 你打算如何去改进自己的缺点呢?
6. 你平常放松自己会通过什么方式呢?
7. 你觉得大学中最紧张的时间段是什么时候呢?
8. 你是打算实习然后转正吗?
9. 你平常会怎么安排自己一天的时间呢?
10. 入职之后你打算怎么平衡实习和课业学习呢?