还原腾讯的一场 30K—50K 的 Android 高工面经
12、你如何自己实现一个 LRUCache?Android 里面的 LRUCache 是如何实现的?
13、synchronized 和 volatile 的区别?为何不用 volatile 替代 synchronized?类锁和对象锁互斥么?
14、gcroot 的类型
15、jvm 的运行时数据结构。栈帧中会有什么异常?方法区里面存放的是什么数据?
16、动态代理的实现。
17、Gradle 的实现,gradle 中 task 的生命周期。
18、Aop、AspectJ、ASM 了解么
19、组件化和模块化的区别。ARouter 的缺点。
20、MVP、MVVM 的优缺点,jetpack 中的组件
21、okhttp 源码。
22、glide 缓存
23、你对 flutter 的理解
二面
1、react 的单向数据流
2、redux 的状态管理,如何实现的?关键角色有哪些?
3、flutter 的 channel 通信有哪几种?你用的哪种?插件你如何实现的?
4、flutter 的包体积优化
5、自定义 View 的关键步骤,注意事项,你的理解
6、MeasureSpec 讲一下
7、包体积优化
8、混淆的步骤和原理
9、module 间的资源文件 merge 后,生成过多的 R 文件,处理过么?如何处理?
10、Bitmap 内存大小,注意事项,如何优化
11、启动速度优化
12、glide 中对 Bitmap 做了哪些操作?三级缓存?为何在有了内存缓存后,还要持有 ActivityRef 这个呢?
13、gradle 声明周期,task,插件
14、注解:Source 和 Class、Runtime 注解的区别
15、卡顿优化
16、内存泄漏检测及优化
17、RecyclerView 的缓存,局部刷新用过么?
18、List 的滑动卡顿如何优化
19、Activity 中的 Window 的初始化和显示过程
20、Application 中可以显示 Dialog 么?为什么?
21、泛型擦除,为何会有擦除?擦除的时机。通配符。
下面这段代码有问题么?有什么问题?为何会有这个问题?
List<? extends Object> list = new ArrayList<>();
list.add(123);
Object obj = list.get(0);
22、synchronized 的同步原语
23、锁的几种状态
24、Android 热修复原理,tinker 的 patch 文件如何生成,patch 文件是全部加载 dex 文件首部么?
25、插件化原理
26、两个用单链表表示的大数相加,求他们的和。单链表元素的值为 0~9。
三面
1、讲下 hashmap;链表转红黑树的限制为何是 8;红黑树的时间复杂度;红黑树转链表的限制为何是 6;current hashmap 在所有情况下都是线程安全的吗?hashtable 呢?
2、synchronized 实现。非静态方法 A 和 B 在同一个类中,方法 A 用 synchronized 修饰,当 A 方法因为多线程请求有线程阻塞在对象锁上的时候,B 方法的访问受不受影响?
3、既然泛型有编译期类型擦除,那么运行时无法获取到具体类型;而反射能在运行时获取到 Class 的类型;它们一个获取不到,一个可以获取到,这不就是矛盾么?请解释下细节。
4、在同一个手机上,如果把 drawable-xxhdpi 下的图片移动到 drawable-xhdpi 下,图片内存是如何变的,解释原理。如果在 drawable-hdpi、drawable-xxhdpi 下放置了图片,但是手机是 xhdpi 的,会优先加载哪个,加载优先级是怎样的?如果是 400_800,1080_1920 这种呢,会如何查找?xhdpi 和 400*800 同时存在时,会如何查找?布局文件呢?
5、图片内存优化;
6、Handler 机制。MessageQueue 中的 Message 是如何排列的?Msg 的 runnable 对象可以外部设置么,比如说不用 Handler#post 系列方法(反射可以实现);
7、application 中持有静态的用户信息,有何缺点?如何改进?
8、mvp 和 mvvm,jetpack
四面
1、选一个你的项目讲一下
2、技术选型是如何做的
3、优化内存
4、上传的重试机制
5、OOM 和内存泄漏
6、包体积优化
7、你最擅长的点
8、你的职业规划
最后的我,很幸运,在 2021 的七月份,拿到我人生中第一个互联网大厂的 offer。当后面 HR 跟我谈薪的时候,我才明白这一次我真的成功了。在高兴和惊喜同时我也想分享我的个人面试心得,希望能给到准备冲大厂的朋友一点帮助。
三、面试后的个人心得
准备周期
面试之前,最好先系统的复习一下基础知识,然后再复盘下自己的项目经历,把亮点都发掘出来。复习周期个人建议是一个月到三个月,时间不宜太久,久了就容易懈怠或者闭门造车,三个月的时候最好出去开始试水,检验一下自己的学习效果。
复习计划的制定和进度的把控也很重要,可以参考我的学习计划去学习,再根据自己的实际情况去做适当的调整。
复习技巧
我一直认为学习没有捷径可言。我信奉"好记性不如烂笔头",也信奉"书读百遍其义自见"。
一定要去实践。对于我们程序员而言,不单单是死记硬背,我们有更好的方式去学习,比如写 demo 去验证,比如学习源码的过程中,一定要自己去翻看源码,多翻几遍看熟了再说。
学习笔记我认为很重要,不仅要记笔记,还要写心得体会,文字笔记、画图、总结等,方式很多,但是一定要自己认真去做,不要太相信自己的记忆,只有反复记忆,加深理解才行。
学习知识点的过程中,可以遵循 What、How、Why 这个三板斧。即这个东西是什么?它是怎么做的?它为什么这么做,原理是什么,有没有更好的方式?
在复习的过程中,都是从一个个小的知识点开始学的,复习到一定阶段,可以尝试着去把这些东西串联起来,由点及面。
另外在复习的过程中,一定要及时跟你做过的项目结合起来,这样也可以反哺你的项目,你在面试时就知道怎么聊了,就会有项目讲到知识点,由一个知识点串联到另一个知识点,这样你的知识体系就建立起来了。
答题技巧
面试总体上是一个你跟面试官相会了解、相互交流的过程,大厂的面试官一般都很奈斯,如果你遇到不会的问题了,可以及时请教对方,不会了就问,不要怕丢面子,面试本就是一个学习和相互交流的过程,offer 不是目的,只是个过程。
另外,有些时候某些技术或者知识点你不了解细节,但是大体的设计思路你是知道的,你就尽可能的答出你的理解,可以用横向的类似的技术去阐述这个技能点。
有些时候如果某个知识点一时半会想不起来了,可以迂回一下,跟递推公式一样,根据你擅长的知识点,一步一步去推导,先大胆假设,再小心求证,推导的过程也能说明一些问题。
还有需要注意的一点,对于不会的东西,可以尝试从原理角度去回答,但是尽量不要说错,回答的不全和方向错了是两个概念。
这里给大家准备一份我在*
*家复习过的《Android 面试核心知识 PDF》,这份笔记是我面试之前花了二个多星期整理的,在面试过程中,这份笔记也帮了我不少的忙。但是因为简书的推荐机制,这里不能展示全部,如有需要这份资料的朋友可以私信我【面试】我发给你下载地址**。
评论