这可能是9102年末最全面的Android面试总结,你值得拥有!
2019即将过去2020年即将到来,今天就来聊一聊这大半年的面试经历,面了几家公司发现一个规律,越是出名,技术牛逼的公司,面试官都很谦虚,整个面试过程也都很舒服,遇到不会的问题面试官也都会引导你去回答问题或者给你思路,相反去一些所谓的有点小名气的公司,遇上的面试官一个个都板着个脸,感觉自己厉害的不行,要是某个问题没答上,马上一个白眼过来,就算你问他答案,他也会说回去自己看去。
我觉得面试考察的是一个人的综合素质,就以Android来说,那么庞大的一个系统再结合Java语言的相关知识点,作为开发人员不可能会每个知识点都精通再加上每个面试官的表达能力也不同,有时经常会出现面试者没有完全理解面试官的意思,所以我觉得一个优秀的面试官应该是很耐心的,如果遇到面试者答不出来问题时,应当去适当引导一下,或者给面试者告诉正确答案,而且一个好的面试官首先应当表现出很友善的样子,这样才会让面试者有一个好的发挥。
下面先总结一下常见的Android面试题:
Java部分
- Java内存区域
- Java虚拟机/垃圾回收算法
- synchronized原理/synchronized修饰对象方法和修饰静态方法有什么区别
- 线程池原理,线程池是如何进行线程复用的
- 线程间如何通信,消费者/生产者模型
- volatile关键字作用,使用场景有哪些
- 可变对象/不可变对象
- 集合(ArrayList,HashMap,LinkedHashMap等等)原理
- 内部类的作用,特点
- 设计模式(代理模式,装饰器模式,工厂方法模式等等)
- 泛型
- equals和==区别?如果没有覆写equals,两者有什么区别
- 弱引用和软引用
Android部分
1. Activity生命周期
这个是必问的,建议最好可以看看源码,如果不看源码,也可以打log看一下各种场景下的生命周期。
2. Activity启动模式
同样必问,先弄清楚每种模式的作用,再挨个模拟一遍,结合生命周期来看
3. Activity启动/创建流程
这个最好大致看一下,能说出来一些具体流程会给面试官一个好的印象
4. ActivityThread作用
能知道ActivityThread作用,那证明你是看过源码的,一定要自己去看源码,不要只看什么博客,因为如果你能说出ActivityThread作用,面试官会认为你是看过源码的,继而会深入一些细节,如果你没看过源码,你肯定无法了解细节。
5. Fragment生命周期,Fragment的生命周期是如何对应到Activity的生命周期,addFragment,replaceFragment有什么区别
对于这个,建议还是自己看源码,其实不是特别复杂,看完源码会对Fragment的管理有一个很好地了解。
6. startService和bindService区别
7. ContentProvider的生命周期/数据库如何进行升级
8. 跨进程通信/Binder
这个问题也是必考,Aidl, Messenger, ContentProvider, 广播等等,由此还会引出Aidl如何使用, Aidl和Messenger区别,Aidl本质是什么,什么场景下会使用Messenger, 对Binder有了解吗,如何你能很好的说出一些关于Binder的理解,那是相当的加分
9. Handler原理
这个还用强调是必考吗?这个都说不出来的话,那估计面试就直接结束了,Handler一定要去看源码,源码并不多,写得也很清楚,面试官一般都会问下面这几个问题: 一个线程可以有几个Looper? 当然是一个,那是如何保证线程只能有一个Looper呢?Message是如何和Handler联系起来的?Handler又是如何同Looper绑定的?
10. 广播,全局广播和本地广播有什么区别
11. View绘制原理
这个同样需要看源码,因为现在分析View绘制原理的文章太多了,你只回答个onMeasure, onLayout, onDraw根本不行,面试官会问很多细节问题,另外对于MeasureSpec一定要弄清楚是怎么回事,自己也一定要动手写过自定义View
12. View事件拦截
必考题!依然是需要看源码,会问很多细节的,然后还有一定要多练习,模拟一下各种事件分发的场景,比如典型的是ACTION_CANCEL事件是如何产生的?
13. Window作用,Window,Activity, View区别/DecorView是什么
14. 进程的优先级
15. 进程保活
16. 内存优化/内存泄露
这个也算是必问的吧,这个问题会很能反映出你是否对性能有要求
17. RecyclerView有什么优势/内部原理
18. IntentService的原理
19. View的优化/LinearLayout性能为什么会比RelativeLayout好
20. 常用开源库原理/对比
典型的就是看OkHttp,然后会比对一下Volley和OkHttp各自的优点和缺点,除此之外,Retrofit,ButterKnife,Glide也可能会问到
21. 动画的分类和区别
22. ANR的处理
数据结构/算法:
1. 排序算法
必须掌握的是快速排序,归并排序,堆排序,其他的如插入排序,冒泡排序,选择排序都不用说了,属于最简单的排序算法,如果连这几个都不会,那面试基本挂定了
2. 二分查找
3. 实现栈/队列
4. 树的遍历
前序遍历,中序遍历,后序遍历,层序遍历,不光要知道每种方法遍历的方式,还要能写出代码,一般来说前序,中序,后序的代码比较简单,用递归就可以实现,层序遍历需要用迭代的方式配合队列来实现
5. 算法题
这个没啥好说的,刷题吧,剑指Offer这类的书多看看吧,主要学习一下里面的思路
网络知识:
- TCP/UDP区别
- TCP是如何保证请求一定会到达
- TCP的三次握手和四次挥手,为什么是握手要三次,挥手却要四次
- Http请求格式,常见头部(这个基本是必问的)
- Https和Http区别
- Https握手过程
如果上面这些题,你能掌握个85%左右,那拿到offer基本没有问题了,不过面试过程中还有一个很重要的考量因素,那就是你的沟通能力以及情商问题...其实情商这个东西,非常重要,尤其作为程序员,因为程序员是做需求的,而提需求的产品肯定会有各种各样的需求或者不断地催进度,如果情商低,那双方难免会发生矛盾甚至是吵架,所以在面试过程中一定要展现出自己善于沟通的一面,当然情商这个东西也不是说好就能好的😂😂😂。。。还是要靠平时的积累,不要太以自我为中心。
下面具体说一下我觉得很好的面试经历和相当糟糕的面试经历,如果你对以下内容不感兴趣,那就可以直接关闭当前页面了😄😄😄
愉快的面试经历
- 艺龙
艺龙网的面试挺简单的,没有笔试,没有现场手写算法题,面试官直接面试,问的也基本都是Android相关的问题,对艺龙的面试印象最深的是面试官问了一道关于Looper的题,让我瞬间懵逼,因为之前非常细致的看过Looper相关的源码,所以当面试官问道Looper的原理时,我很自信的答了出来,结果面试官紧跟着问了一句Looper.loop里面是一个无限循环,为什么没有阻塞线程,我瞬间懵了,虽然看过源码,但之前看源码的时候确实没考虑过这个问题,我说“这个我确实没有关注过,你能给我说一下吗",然后面试官说其实他也不是很清楚😂,他也只能说说他自己的理解,就这样,我俩就好像已经是同事一样,针对这个问题讨论了一会,说了说各自的理解,再之后基本上问的也都是一些基础性问题,整个面试过程还是相当轻松的,让我很有好感的就是,面试官愿意同面试者一起讨论一个问题,能感觉到面试官平时就很谦虚。
- 网易
网易上两周前去的,网易的流程也是先笔试,网易的风格一直都比较学术派,所以笔试题题量不大,但是每一道题目都很有技术含量,考察的都是一些平时不太注意,但却很容易出错的基本技术知识点,当然笔试题里面必然有算法题,笔试答完后,开始第一面技术面,这次面试,我状态并不好,发挥的不怎么样,面试官问的一些问题略微有一点偏,不过也都是基于实际应用场景问的,我平时只顾着复习一些感觉很常见的面试题,在开发中对于一些小细节也没有过多的关注,所以答得并不是很好,不过也让我收获颇多,面试官全程态度都很友善,即使答不上来或者答得不好,面试官也会很友好的说没有关系,可以慢慢想之类的话,面试完后,面试官还专门问我是否觉得他问的问题有些偏门,而且让我有什么想法都可以说,面试官还说面试本来就是一个相互学习的过程。虽然我发挥的不好,但是这种面试过程还是很让人享受的,至少从这次面试中学到了很多知识。
- 美团
美团我申请了两个部门,两个部门总共经历了七轮面试...但是每一轮面试都让人很舒服,技术面的面试官问的问题都很专业,考察的也很全面,java基础,多线程,Android相关,数据结构都会考察,而且每一个面试官都会随身带电脑,时刻记录我的答题情况,去第二个部门面试时,写算法题,面试官还会提供思路,引导我将代码写出来,所有问题问完后还会问我,有没有我觉得自己很擅长,但是他没有问到的地方,如果有,可以直接说出来,总体而言,我经历的这几个面试官都很友善,而且也能很明显感觉到面试官的技术水平也相当高,虽然经历了多轮面试,但每一轮面试都让人很舒服,还有一个很好玩的事情是在第一个部门面试的时候,第二面面完后,面试官出去了一会后回来给我说今天先这样,总监不在,hr会和你改天再约时间,我当时一听,心就凉了,我以为挂了,因为很多公司玩的都是这个套路,不过我看第二面的面试官挺友善的,就在他送我出去的路上问他是不是挂了,然后他看着我说"没有啊,总监真的不在,我这个人从来不骗人",事实证明,他真的没骗人😄😄,刚出美团不到二十分钟,约第三面的电话就打过来了。
说完让我愉快的经历后,就再吐槽一下我遇到过的两个奇葩面试官,当然以下全是我个人经历,我并没有对这两家公司有什么恶意,我的面试经历也不能代表这两家公司的技术水平,也许这两位面试官恰好当天心情不好,刚好赶巧的就让我遇上了。。。
- APUS GROUP
这个公司说实话我以前没听过,但因为是做海外市场,这个公司其实相当相当赚钱,公司在望京SOHO,整整一层,望京SOHO那种租金超级贵的写字楼,能包下整整一层,可想而知是有多么赚钱,公司门口还专门配了两个保安,填完表都不让进,还必须让给我发邮件的hr出来接才可以,我瞬间就被这阵势唬住了(这里还有个题外话,保安问我联系的hr是谁,我说完名字打完电话后,保安让我去旁边坐着等,然后我就听见这俩哥们在评论我刚刚说的hr的身材,说这个hr身材很丰满之类的,我很鄙视的看了他俩一眼,心里想着你们真低俗,我是来面试的,结果让你们说的我现在就想看看hr美女是不是真的很丰满😂),hr美女接到我后,让我在一个小会客室等待,因为前一天没有合理安排时间,导致时间很紧张的跑了两家公司面试(这两家公司一个在北四环,一个在南二环),所以整个人一坐下来感觉有点懵,想睡觉,等了五分钟左右,面试官来了,其实面试有时候也是要看眼缘的,但很明显,我跟这个面试官没有眼缘,这里没有要攻击这个面试官的意思,但是人有时候就是很神奇,会有一种直觉,面试官给我的感觉很凶,所以第一印象有点不舒服,感觉面试应该不会很顺利(事实也确实如此),评心而论,那天我自己的发挥也确实不怎么样,脑子很迟钝,有些问题很简单,自己也确实知道答案,但是就是半天说不清楚,所以如果没有后面的事,那这次失败的面试就应该完全是我的问题,我也就不会说这次面试奇葩了。
面试官一上来就说自己感冒了,而且一看就是很明显的技术男,平时应该不爱说话那种,说话声音很小,鼻音很重,所以他说的话我经常听不清,记得有一个问题是他问我:你写的打包脚本里有修改清单文件吗?结果我听成了有没有其他文件,然后我很果断的说没有修改其他文件,修改的是AndroidManifest文件,正要继续往下说的时候,他用一种看傻逼的表情看着我说,AndroidManifest文件不就是清单文件吗,你连这个都不知道?😤😤😤我真的是一千头草泥马奔腾而过,双方都沉默了几秒钟以后他又问我,你知道HashMap的原理吗,这必须知道啊(小儿科),给他说完以后,让我意想不到的是,他居然说我说错了,我当时还以为可能是我没表达好,他理解错了,又细说了一下,他依然很坚定的说不对,并且那种看傻逼的表情再次出现,翻了个白眼对着我说,回去好好看看源码吧,当时我就有点火了,虽然当时还不能确定我是不是真的说错了(事实是我根本没有说错!!因为面试一出来我马上就重新看了源码),但是他那种看傻逼的表情真的让人相当非常以及十分不爽,这也导致我心态有点不好了,也就发生如下的对话:
面试官: "知道synchronized的原理吗"
我: "不知道!"
面试官: "那知道除了synchronized以外,还有什么方法可以进行线程同步"
我: "不知道!"(此时面试官抬头看了我一眼,应该能感觉到我有点不耐烦)
面试官: "那这样吧,给你一个场景,要将sd卡路径下所有文件读一遍,应该怎么样设计线程模型"
我: "什么叫线程模型?"
面试官: "。。。就是要用几个线程,每个线程做什么工作"
我: "哦,没做过这个功能,不会!"
面试官抬头看了我一眼,摇了下头,估计知道我是在赌气,因为就算前两个问题真的不会,第三个问题是很开放的,完全可以说出自己的思路,沉默了一小会,他说你有什么问题要问我的没,我心想都面成这样了,问你问题还有什么卵用,就直接说没有,然后他起身说那今天就面到这里,我一听这个,那叫个激动,我巴不得赶快结束,所以马上起身准备往外走,但是这个面试官又拦住我说,你先等一下,我瞬间觉得有点不可思议,都面成这个鸟样了,居然还不让我走??事实是我想多了,面试官出去以后差不多五分钟左右,丰满的😂hr美女出现了,笑着说今天就到这里,我们会评估一下,过几天再联系你,看着她笑容满面的脸,我瞬间想起电视剧潜伏里面吴敬中站长的一句经典台词,满嘴虚伪的外交辞令,然后让我走了,嘴上还说这那我就不送了啊,我真的是。。。面试完直接让我走不就完了吗,非要人再多等五分钟。
上面说的面试经历,我觉得双方都有问题,我的问题在于自身状态就不好,不应该赌气,另一边的问题在于如果面试官感冒了就应该更换面试官,这也是对面试者的尊重,另外就是,即使面试者没有答对问题,面试官也不应该露出那种鄙夷的表情,如果面试者答错了,应该告诉他哪里错了,这样面试者才能知道自己哪错了。
以上两段内容仅供娱乐。。。以上两次不堪的面试经历只是我个人的面试经历,并不代表上面两家公司不好,大家如果看完了,就当读故事了
关于面试的充分准备
一些基础知识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,我能明显感觉到国庆后多了很多高级职位,所以努力让自己成为高级工程师才是最重要的。
好了,希望对大家有所帮助。
接下来是整理的一些Android学习资料,有兴趣的朋友们可以关注下我【主页的简介】查看免费领取方式。
①Android开发核心知识点笔记
②对标“阿里 P7” 40W+年薪企业资深架构师成长学习路线图
③面试精品集锦汇总
④全套体系化高级架构视频
Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
获取方式:关注我 主页 查看免费领取方式!