2021年 Android面试总结:5年开发经验10场面试后收割offer,千万别让这些面试题摧毁了无数日夜的努力!

一年一度的金三银四面试旺季又即将来临了!

面试决心

12月初,靠着朋友的内推,面试了京东北辰,虽卡在hr面试,但是本人对自己的技术能力很有信心,2020年12月22日提出离职,利用7天年假时间去集中面试,最终如愿拿到满意的offer。

投递简历时,只考虑公司规模,投了10个左右的公司集中面,面试过程一波三折,虽然不是技术面试上的问题,但是有几家hr和审批也卡人的情况,让我猝不及防,不知如何表达当时的心情,委屈的内心只能苦笑。

功夫不负有心人,是个坑总有人跳的,终于入坑新东方在线,第一个收获的offer,终于赶在1月18日生日前得到一丝慰藉,哇咔咔!

面试统计

从我的面试情况来看,不要以为技术面试过了就稳了,hr会卡人(京东),审批会卡人(货拉拉),所以,面试的时候,要多面试几家,不要一棵树吊死。

(1)技术面试,通过 9家:

千喜鹤(2面),广州星域(3面),宝沃(2面),京东北辰(4面),京东物流(3面),松果出行(2面),新东方在线(4面),货拉拉(3面),APUS(2面)

(2)技术面试,未通过 3家

探探(一面),小红书(一面),头条(二面)

(3)hr或审批,未通过 3家

京东北辰(商详组):四面技术通过,5面hr拒绝,非学历背景原因,是hr面试踩坑了,可惜了。

APUS:2面技术没问题,但是hr拒绝(如果自己当时的工资流水高的话,公司背景好点的话,我就大概率过了,不难过,hr看人也看背景,理解)

货拉拉:3面技术+hr面试没问题,但是审批拒绝,很干脆,说有多位候选人了,就不考虑我了(谈薪资阶段咔嚓掉了,比较心意的一家,委屈呀)

(4)通过后个人拒绝,2家+

截止1月16日,已经收到1家offer并且表态入职(新东方在线,给的薪资比较满意,附近还有好几个同学能一起玩),所以再有新的offer的话,我就不考虑了。目前已经提交流水和期望薪资,还在审批的有3家(京东物流,松果出行,北京宝沃汽车),不过我大概率会拒绝或者让他们拒绝了。

千喜鹤,个人拒绝了(12月6号周六跑去面试的,2面技术通过,hr和领导太墨迹,就拒绝了)

广州星域,个人拒绝了(12月25号,现场技术3面,答应的薪资要求,刚出门就打电话说减2K才能进,果断拒绝)

面试题总结

说完个人的面试情况,进入正题,下面是我面试这几家的所有面试题,有很多重复的面试题总结,所以,就不按照公司排序了。

未通过时的几个面试题

包含京东,头条,探探,小红书没答好的几个问题

京东:

(1)如何设计模块,组件,sdk,如何考虑
(2)说说你项目的架构,为何这么设计或这么考虑
(3) 说说内存泄漏,越多越好
(4) 说说你的技术难点,如何解决,如何思考
(5)apk安全,你如何考虑
(6)act+fragment的完全生命周期(不是单个说哦)
(7)京东北辰:recyclerView源码,必会,包括缓存如何实现,哪几个缓存,运作流程等;各种notifyXX的原理,触发哪些重绘;如何实现下半部分item不移动,上半部分的item高度变化的实现?

探探比较好的面试题:

(1)手拖动View,手松开后完成一个泡泡破裂的动画效果(本质是view事件分发机制+动画选型,分发机制哪个方法处理什么参数,之后怎么触发动画效果等,问的灰常具体,吐了)
(2) 自定义view相关,invalidate,postInvalidate,requestLayout,深入的说说framework层的流程原理
(3)kotlin 协程深层原理如何实现的
(4)dcl是否线程安全?哪一块出问题,为什么volatile能实现防止指令重排,指令级别如何实现的,对象的创建过程等(多家都问了,很深入)

头条二面失败问题:

(1)Permission标签和uses-permission标签的区别,设置Permission标签,如何保证其他进程app不会访问到act界面?
(2)多手势的具体实现
(3)转场动画具体实现
(4)画中画具体实现,悬浮窗口具体实现
(5)aidl binder异步调用具体实现
(6)如何实现定时任务
全是具体实现,我就呵呵了。

小红书:

(1)concurrentHashMap 如何加锁的
(2)measure参数详解,view设置wrap不起作用
(3)Bind service,如何实现保活
(4)两个进程act,如何加快启动速度
(5)性能优化(面试官老插嘴,都说不上话)
(6)Eventbus如何实现线程的切换
(7)jetpack的Navigation的xml引用,在什么时候调用的?
(8)Inflater.inflate如何实现xml转java的(framework),方法中的各个参数含义。

通过的面试题,按个人梳理后列举

基本问题

  • 范型:<super>和<extends>的具体区别;在java编译过程中的实现原理(范型擦除);逆变协变(范型子类的转换问题)
  • 性能优化(多家都问了,很大的一个技术专题,靠自己总结),个人笔记总结了7块:

启动速度优化
布局优化
代码优化
内存优化(oom anr)
app瘦身
网络优化
电池使用优化
安全优化
存储优化

  • ANR:给个标准的回答流程:anr的几种原因(深入到源码,讲讲AMS.appNotResponding()的流程,你就腻害了),分析工具等怎么分析定位到具体原因。
  • 内存溢出(OOM)+内存泄漏的区别,分析工具或者开源leakcanary,优化方案,可能会问你,handler怎么导致的oom,如何优化等
  • 事件分发机制+嵌套滑动机制原理,区别
  • handler相关(给的很全了)

流程;
threadLocal+内部原理(threadLocalMap如何实现的,key,val是啥,弱引用,是否引起内存泄露等);
loop()为什么不阻塞主线程;
什么是同步屏障(屏障消息);
什么是闲时机制(IdleHandler)+作用;
消息队列的消息排序顺序(delay如何实现的);
Message.obtain原理(用了那种设计模式:享元);
实现子线程的handler流程;
handler内存泄漏及解决方案;
handler和looper,MessageQueue的关系(几个handler几个looper,handler的msg可以再别的handler的handleMessage方法上处理吗);
扩展:子线程和主线程通讯,有哪些方案。

  • 自定义View相关:

framework流程;
mesureSpec的作用;
自定义extends View时,手动处理wrap_content时的坑:直接继承View的控件需要重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用 wrap_content就相当于使用match_parent;
postInvalidate()和invalidate()和requestLayout()的区别(自己总结下吧,里头有很多点要记住);
在Activity的onCreate方法中获取控件宽高的几种方式;
View的Draw(Canvas canvas)的绘制流程;

  • 京东一家问了: io流(字符流,字节流,file和其它流的区别),流如何处理(try catch,流关闭等)
  • dialog为什么不能用application创建,底层原理(window token)
  • service面试,生命周期,bind和start的区别,保活等
  • 设计模式概念,设计原则(SOLID),项目中用到了哪些设计模式,开源项目xxx用到了哪些设计模式,代理模式,动态代理如何实现?单例模式中,静态内部类单例,是final修饰的吗?
  • 线程池,问参数,问keepalive参数作用,源码如何实现核心线程的运行?绝策略?
  • 如何实现https抓包;如何实现网络请求安全?防止别人抓包或请求。
  • 类加载机制原理
  • jetpack,livedata粘性原理,源码如何实现生命感知,旧数据bug如何修复的?
  • jetpack,navigation的xml,在哪个步骤被加载执行的?(很难呀)
  • binder相关,aidl实现原理,如何实现回调,如何实现binder异步调用(头条)
  • contentprovider的使用,如何实现跨进程通讯的?流程?
  • mvc,mvp,mvvm
  • jni开发:动态注册流程
  • 异常捕获(问app的uncaughtException)
  • act的四种启动模式
  • fragment和act的转场动画,用android.app和v4包的区别(头条)

java基础问题/算法/数构/jvm

  • static修饰,final修饰,作用
  • java面向对象特征(封装,继承,多态),具体如何实现
  • hashmap,linkedhashmap,concurrenthashmap,set,都问了,1.7/1.8的各种区别,很细节很细节很细节,具体不说了
  • synchronized,volatile,reenterLock,AQS,各种区别,static修饰synchronized方法的区别
  • 字节码角度说,synchronized底层原理(对象头,锁升级过程,自旋锁)
  • 反射,如何修改final修饰的参数(类反射)
  • java内存模型,java运行内存模型及作用,G1回收机制,VM栈的执行流程,指令熟悉吗?
  • 四种引用的区别
  • 线程的状态有哪些?
  • equels和hashcode的区别,再set中如何实现?效率问题?为什么要重写等
  • https/http区别,tcp/ip和udp区别,三次握手四次挥手,货拉拉问了tcp底层原理+如何保证tcp传输可靠性(校 序 重 流 拥)
  • k步长的链表反转
  • 二叉树中序遍历的两种实现
  • 一个数的开平方算法
  • 数组中,成对出现,只有一个单独出现?如果有两个单独出现?
  • 链表反转有几种实现?(栈,数组等)
  • AB线程打印

第三方框架题

说明,简历上写的第三方框架,一定要会,而且要看源码,

  • Retrofit(每家必问),看源码+详细总结
  • Okhttp(每家必问),看源码+详细总结
  • Rxjava(高频),会问上游线程调度和下游线程切换,背压等
  • LeakCanary(高频):和OOM一起问,问原理
  • Glide(高频):缓存实现原理,流程(linkedHashMap)
  • ORM数据库:ROOM,DBFlow,DaoGreen:
    使用数据库和使用文件缓存的区别
  • MMKV(10家问了一家)

framework/项目/框架/总监级别问题

  • 冷启动流程,设计哪些进程,
  • Act,window,View的区别,源码介绍下
  • AMS的作用
  • sdk设计,你如何实现
  • 埋点sdk,你如何实现:
    埋点方法,存储,上传,线程池,异常等
  • 组件化,模块化,你是如何实现的,组件通讯如何实现的
  • 插件化(不会,只看了腾讯的shadow),原理
  • 项目介绍,重构,迭代等,问你在项目中做了哪些,遇到了哪些问题,如何解决的?(这块很重要,要有亮点,如你负责的这个模块,达到什么效果;或者你的重构,能解决什么痛点;或者你解决的问题,能给公司带来什么收益等,我按照这三块分类说的,效果不错)
  • 你的项目上,性能优化如何实现的,代表的实例说一个,异常如何监控的等
  • 平时如何学习技术的?你和别人比,有哪些强项?(学习能力,产品sense,总结习惯等,要突出亮点,我的亮点就是项目应急能力,学习总结习惯和开源贡献,或者你的回答,也要将总监向这块引导,突出你的亮点)
  • 简历上写 有较强的编码能力和独立思考能力,注重代码规范和架构重构,项目上如何体现的?
  • 技术问:我这没问题了,你有什么要问的吗
    如果一面二面,感觉没戏了,可以争取下,说说个人技术能力和优势

如果大佬/总监/小组长级别终面,可以适当问问技术栈,技术之类的问题

HR面试问题

  • 问毕业,工作经历,项目经历等,问上家公司工作氛围,问离职原因,问你的强项和弱点(千万别说性格上的,性格开朗都不行,只说技术弱点),最好准备好一套说辞,都是有技巧的,小心避坑
  • 问期望薪资:

个人最想说的一块了,公司股东规定不涨薪,在公司2年多没涨薪,要高薪很困难,所以好几家技术面试通过的,最后hr都卡住了。守到云开见明月,多面试几家,机会总会来。我坚持个人的期望不妥协,终有公司看中我的个人技术能力和人品(5年经验,折算我的期望涨幅达73%)。很感谢新东方给了个人机会,我会努力回报滴!乌拉!

  • 总监也会问/hr也会问:你的个人短期目标和长期目标
  • 还有什么要问的吗?
    hr问的这个这个问题,最好问她擅长的,如人事,薪资,待遇,团建等等

其他面试题(略杂)

  • kotlin:语法糖等
  • 为什么用kotlin,和java比的优势?性能优势?
  • flutter问了基础

非科班的突围历程和心得

野生程序员的成长经历:

本人是山东普通一本学历,机电专业,15年转行做的andorid开发。作为一个野生程序员,成长历程比较坎坷,开始靠培训机构或者个人自学,初级时就能入职互联网开发,非常困难,初级入职阶段,就能淘汰一大批培训机构的同学,很幸运自己能实现转变,很感激帮助我的同学和第一家时经理收留信任。靠着自己2年多的不断的学习和积累,从一个小白白成长为一个合格工具人,还完成个人薪资翻倍的跳槽。

在第二家公司,也慢慢的技术视野和深度的扩展,能从容应对开发和各种问题。由于公司没有涨薪制度,所以就有了跳槽的计划准备,没想到,这一准备,就是2年时间,靠着总结和积累,跳槽就水到渠成,没有多少运气加成,全是踩坑过河。

所以,对科班人来说,我就是最笨的成长。虽然初期的成长慢了些,但是我有我的坚韧性格,成长多远,多半靠自己,多多灌输自己点励志鸡汤,多多学习别人的长处,多虚心请教别人的心得和学习习惯,成长也是很快的。

成长心得:

不说废话,只说关键点:

(1)要有技术总结。技术点总结、遇到的坑总结、大技术点专题总结(笔记+代码示例),整理成笔记,时常翻看(写博客也需要用笔记先总结好)
(2)有笔记习惯。记录技术,异常,新技术,复盘总结,日报总结,学习计划,好的点子等,一切认为可总结的技术点,都做成笔记。后期翻看时,可以增加自己的思考角度维度,为日后做核心岗位做准备。我这个习惯已经保持了2年多,当前能完成跳槽,这个习惯给了我最大的支持,让我水到渠成。
(3)看源码学习。好奇心多一些,当成享受,时间长了,你就自然而然的厉害了。
(4)如果对公司有期望,做事要负责实干,领导的刁难或严苛,要学会皮实应对,说不定是扶持你上位的考验

面试复习资料分享

资料不在于多,而在于精。下面我就简单分享一下曾经对我帮助比较大的几个面试复习资料。

多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!

简历+社招解答+经典HR面试解析

以上是整理总结的Android中高级面试遇到的真题解析,希望对大家有帮助;同时很多人经常也会遇到很多关于简历制作,职业困惑、HR经典面试问题回答等有关面试的问题。同样我也搜集整理了全套简历制作、金三银四社招困惑、HR面试等问题解析,有疑问,可以提供专业的解答。

接下来是系统的复习路线,可以参考一下:

1、看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。

2、进行系统梳理知识,提升储备

客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

  • 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
  • Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化
  • 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化
  • 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
  • NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发
  • 微信小程序:小程序介绍+UI开发+API操作+微信对接
  • Hybrid 开发与Flutter:Html5项目实战+Flutter进阶

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

3、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

4、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容

猜你喜欢

转载自blog.csdn.net/weixin_44339238/article/details/114268439