写点什么

还原腾讯的一场 30K—50K 的 Android 高工面经

用户头像
Android架构
关注
发布于: 8 小时前

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学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


*家复习过的《Android 面试核心知识 PDF》,这份笔记是我面试之前花了二个多星期整理的,在面试过程中,这份笔记也帮了我不少的忙。但是因为简书的推荐机制,这里不能展示全部,如有需要这份资料的朋友可以私信我【面试】我发给你下载地址**。

四、面试常考的 Android 知识点(部分)

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
还原腾讯的一场 30K—50K 的 Android 高工面经