美文网首页Android开发
还原腾讯的一场 35K—55K 的 Android 高工面试

还原腾讯的一场 35K—55K 的 Android 高工面试

作者: 10块钱new一个对象 | 来源:发表于2021-01-08 21:06 被阅读0次

    一、面试的由来

    事情是这样的,因为跟公司发展一些想法的不同,早在十月份的时候就有了跳槽的想法,但是碍于老大的面子就一直就没有跟人事说出口,打算着等到年后金三银四在试试跳槽。

    但是发生一件事终于让我忍不住了,人事不知道从哪里听的消息跟BOSS说了我想跳槽的想法,然后我就被谈话了,本来还留存在一些愧疚的心情顿时感觉烟消云散,在三十分钟的谈话结束之时,我选择了一个普通人的接受不了的想法,“裸辞”。交接完毕之后,第二天下午我便离开了待了三年之久的公司。

    裸辞后,我本打算着年后再去试试互联网大厂,但是一次偶然的机会,我的大学同学不知从哪听到了我离职的消息找到了我,说腾讯的一个项目组急招一位Android高级开发工程师,问我有没有想法去试试。

    我便想着我在家也复习的差不多了,现在机会来了,先去试个水也不错。结果跟他说了,便开始下面的这场面试;

    腾讯阅文某项目组——Android高工面试题

    一面

    1、View绘制流程。onMeasure、onLayout、onDraw。
    2、竖向的TextView如何实现。TextView文字描边效果如何实现。
    3、事件分发。冲突解决。
    4、动画
    5、RecyclerView的特点和缓存
    6、SparseArray和ArrayMap。具体实现原理和特性
    7、说一下kotlin的优缺点。let和with的区别
    8、接口和抽象类的区别,接口中可以有属性么?
    9、用过哪些设计模式?策略模式和桥接模式的区别
    10、多线程如何实现?有哪些方式?
    11、线程池的参数
    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的,会优先加载哪个,加载优先级是怎样的?如果是400800,10801920这种呢,会如何查找?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、你的职业规划

    最后的我,很幸运,踏在2020的末尾,拿到我人生中第一个互联网大厂的offer。当后面HR跟我谈薪的时候,我才明白这一次我真的成功了。在高兴和惊喜同时我也想分享我的个人面试心得,希望能给到准备2021春招冲大厂的朋友一点帮助。

    三、面试后的个人心得

    准备周期

    面试之前,最好先系统的复习一下基础知识,然后再复盘下自己的项目经历,把亮点都发掘出来。复习周期个人建议是一个月到三个月,时间不宜太久,久了就容易懈怠或者闭门造车,三个月的时候最好出去开始试水,检验一下自己的学习效果。

    复习计划的制定和进度的把控也很重要,可以参考我的学习计划去学习,再根据自己的实际情况去做适当的调整。

    复习技巧

    我一直认为学习没有捷径可言。我信奉"好记性不如烂笔头",也信奉"书读百遍其义自见"。

    一定要去实践。对于我们程序员而言,不单单是死记硬背,我们有更好的方式去学习,比如写demo去验证,比如学习源码的过程中,一定要自己去翻看源码,多翻几遍看熟了再说。

    学习笔记我认为很重要,不仅要记笔记,还要写心得体会,文字笔记、画图、总结等,方式很多,但是一定要自己认真去做,不要太相信自己的记忆,只有反复记忆,加深理解才行。

    学习知识点的过程中,可以遵循What、How、Why这个三板斧。即这个东西是什么?它是怎么做的?它为什么这么做,原理是什么,有没有更好的方式?

    在复习的过程中,都是从一个个小的知识点开始学的,复习到一定阶段,可以尝试着去把这些东西串联起来,由点及面。

    另外在复习的过程中,一定要及时跟你做过的项目结合起来,这样也可以反哺你的项目,你在面试时就知道怎么聊了,就会有项目讲到知识点,由一个知识点串联到另一个知识点,这样你的知识体系就建立起来了。

    答题技巧

    面试总体上是一个你跟面试官相会了解、相互交流的过程,大厂的面试官一般都很奈斯,如果你遇到不会的问题了,可以及时请教对方,不会了就问,不要怕丢面子,面试本就是一个学习和相互交流的过程,offer不是目的,只是个过程。

    另外,有些时候某些技术或者知识点你不了解细节,但是大体的设计思路你是知道的,你就尽可能的答出你的理解,可以用横向的类似的技术去阐述这个技能点。

    有些时候如果某个知识点一时半会想不起来了,可以迂回一下,跟递推公式一样,根据你擅长的知识点,一步一步去推导,先大胆假设,再小心求证,推导的过程也能说明一些问题。

    还有需要注意的一点,对于不会的东西,可以尝试从原理角度去回答,但是尽量不要说错,回答的不全和方向错了是两个概念。

    这里给大家准备一份我在家复习过的《Android面试核心知识PDF》,这份笔记是我面试之前花了二个多星期整理的,在面试过程中,这份笔记也帮了我不少的忙。但是因为简书的推荐机制,这里不能展示全部,如有需要这份资料的朋友(点开此处便可下载全部)

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

    • Java基础方面:JVM、String、内部类、多态、抽象和接口、集合框架(Hashmap、Arraylist)、单例、线程、Synchronized、Look锁、动态代理、引用
    • Android基础方面:四大组件、View、进程、Bitmap、屏幕适配、消息机制、线程异步、WebView。
    • Android扩展方面:ART、Apk优化、Hook、Proguard、架构(MVC/MVP/MVVM)、Jetpack、NDK开发。
    • Android源码方面:Leakcanary、Eventbus
    • 设计模式方面:面向对象六大原则、工厂模式、单例模式、建造者模式、观察者模式、适配器模式、策略模式、代理模式
    • 算法方面:排序、二叉树、链表、栈和队列、二分、hash表、堆、数组/双指针、字符串处理、动态规划
    • 网络知识:Http(缓存、Https、Http2.0)、TCP(三次握手四次挥手、socket)、类加载器

    PDF(部分)展示

    五、总结

    总体来说,面试一般都是基于你的简历来进行的,一般先考察你的基础,然后考察你知识体系的完备程度,接着会考察你的极限,最后还会考察一些软技能,比如你的学习能力、协作能力、沟通能力、分析解决未知问题的能力、抗压能力等。

    希望拿到这份资料的朋友能把握机会,在接下来的2021春招面试中能拿到自己心仪的offer。

    PS:《Android面试核心pdf》资料下载地址:(点开此处便可全部下载)

    相关文章

      网友评论

        本文标题:还原腾讯的一场 35K—55K 的 Android 高工面试

        本文链接:https://www.haomeiwen.com/subject/ijzzoktx.html