Android高级面试题:面试十几家公司入职外企后,掌握这几个关
在今年8月份入职了一家外企,恰逢最近几周公司大规模招聘Android开发,有幸参与了十几场面试,遂有感而发。在其中也从面试官的方面有了一些想法,希望分享给大家。
本来当做面试官对于我来说是一件比较新奇的事,但通过几场面试下来,感觉自己对面试有了更为立体的感觉。希望下面的分享能给大家带来一点点的帮助。以下是正文:
首先说一下感想,在一个整个的面试过程中其实有几个关键的点,关键的点掌握的好有很大的几率通过面试
简历
在面试官的眼里,你的第一印象就是简历,简历尽量简洁把自己掌握的关键点描述清楚,最好不超过三页,我就见过一个求职者一共七页简历,在看到第三页的时候已经很难继续往下看了,也就是后边的内容根本不在面试官的视线里。
在个人技能栏目,尽量只写你印象很深或者很有把握的,如果你使用了一个很高深的技术,但是自己说不清楚或根本答不上来,这绝对是一个减分项。可以适当的写一下知名度比较高的开源框架(不过一定要了解一下实现原理,现在已经很少不问原理的了),这次面试的时候有个求职者个人技能写了满满一篇,让我一度以为遇到大牛了,高兴的手舞足蹈,查了好久的资料,结果面试的时候70%都没有答上来,真是那啥了。
在项目经验这里,建议最好优化成三四个参与度比较高的项目,想想其实你的一个简历写10多个项目,大部分项目的框架和技术都是一样的,真的可以整合成一个集合版,反而会体现项目的深度。另外要对你做过的项目绝对的了解,因为面试有肯能就是从项目开始。
表达
有的人说表达没那么重要,这个我要反对一下,好的表达绝对能为自己的面试加分,可以一下提升面试官的好感度。想想一个表达顺畅一个支支吾吾,你会选择哪一个,所以程序员们在提升自己技术的同时,别忘了把自己的表达也锻炼一下。
Java基础
虽然现在Google 主推kotlin语言,但是现在大部分的面试还是以Java为模板去面试,所以我们掌握Java基础是非常有必要的,是扎实的掌握而不是2个问题下去就不知所云。如果你能掌握基础同时又可以把JVM、类加载机制、多线程锁、设计模式(能熟练使用5中设计模式已经足够面对大多数开发)、还有一些数据结构比如(栈、链表、HashMap)了解清楚,通过面试的几率很大,现在面试HashMap已经不简单的了解一些简单的原理,面试官希望听到更深层的原理,所以在这块下点功夫还是很有用的。
Android基础
我们做Android开发这是必备的技能,但最近面试和我自己面试的经验来看,现在的Android面试已经很少面试Activity生命周期等这种低级的问题,好多面试官开始喜欢问一些深层次的原理,比如Binder原理、热修复原理、AMS这种相对系统级的原理。因为现在Android开发工程师还是比较饱和的,企业招聘的需求也会随之提高,更多的会招中高级工程师,而这些也算是进阶的必备,掌握了这些,你才能在面试中有更多的筹码。
第三方库
在项目开发中,我们会使用到很多第三方库,在非常常用的库中,我们一定要找三到四个知名的开源库,阅读它的源码,知道它的原理。比如Glide、okHttp这种,而且要知道和它功能类似的库和它有什么区别,比如Volley和okHttp,因为这些在使用方面实在是太简单了,简单到比Activity的生命周期还省事,所以如果我们只会使用而不了解原理,很难在众多面试者中脱颖而出,很难找到好的工作。如果想往更高级进阶一定要多度源码。
眼界
程序员在平时一定不能只关注自己做的一些技术,有时间一定要多关注其他的技术,比如有时间看一看Vue,尝试用Vue写一段代码,那么你对mvvm框架也会有更深层的了解。
接下来再附上入职前面试几家公司的面试题:
t讯地图
- 算法:非递归实现二叉树前序遍历;
- 手写:双重检查单例类(其中volatile关键字作用)
- GreenDao底层实现
- binder用处和原理
- messager用处和原理
- Android中的内存泄露
- oom原因及如何定位
- 如何降低程序崩溃率
- okhttp源码理解,使用拦截器的用处和好处
- 项目中的难点
- 组件化、插件化
- ExoPlayer源码
- 图片优化,如何压缩、如何缓存
b度
- 算法:检测字符串是否符合ipv4要求
- 结合各种启动模式,Activity各种情况下的生命周期
- 多任务栈情况下的生命周期
- 多任务栈情况下startActivityForResult和setResult有用吗
- 同时启动两个Activity,各自生命周期如何执行
- 同已service,start之后又bind,最后unbind时会执行destroy吗
- IntentService和HandlerThread源码
- HashMap线程不安全的体现
- equals和hashcode的区别
- 方法的重写和重载
- 重载时传入泛型不同的list,会有问题吗
- 泛型通配符的使用,存入本身类对象会出问题吗
- 同一对象的两个锁,分别执行wait和notify,代码执行顺序
- 本地广播可以跨进程接受吗
- 自己设计实现本地广播功能
- handler源码
- message的next方法哪些地方调用到(获取下一message、消息池)
- 延时处理msg时,native层做了什么
- handler构造中传入callback,该接口的handlerMessage方法的返回值有何用处
- EventBus中,父类对象和子类对象同时注册,有什么问题
- EventBus是运行时注解还是编译时注解
- Dalvik和ART的区别
- B站弹幕的源码
- Mediaplayer如何实现音画同步
a奇异
- Handler的postDealy中的runnable何时添加
- onSaveInstanceState调用的时机,其中系统保存了什么,与onRestore..是成对执行吗
- SparseArray和ArrayMap源码和区别
- 线程池的饱和策略
- Activity的各种启动模式和flag、对应生命周期
- okhttp线程池源码
- runnable和callable区别
- 处理注解的时机(运行时和编译时)
- 如何封装播放器
- 播放器各状态的处理
t条
- 算法:递增二维数组查找
- mvc、mvp和mvvm的具体使用和区别
- mvvm不用databinding如何实现
- glide和imageloader区别
- glide如何做到生命周期绑定
- 安卓中常见的内存泄露
- 安卓中常见的oom、如何避免
- merge、include和viewstub的使用
- 如何实现即使通讯
t探
- okhttp拦截器的作用和好处
- 自定义拦截器添加的位置
- okhttp连接复用原理
- rxjava各操作符、map和flatmap却别
- rxjava如何线程调度、原理
- glide源码
- 手写实现图片加载
- ijkPlayer源码
- 事件分发
w吧
- fragment的begin..方法在做什么
- commit和commitAllowStateLoss有何区别
- LinkedHashMap实现原理(单链表还是双链表)
- HashMap扩容的具体操作
- Handler源码,消息轮询会一直进行吗
- 自定义View,子View决定父View的大小
- rxJava操作符,map和flatmap的区别
- volatile操作符的作用
- tcp三次握手和四次挥手
- tcp数据丢失怎么处理,滑动窗口
- 播放器丢帧怎么处理
- im长连接如何实现
- okhttp连接复用如何实现
- jvm内存模型、垃圾回收
- 如何判断对象是否存活
- threadLocal作用和原理
- diskLruCache的使用和源码
m蚁金服
- 父类static方法能否被子类继承、重写
- 普通内部类和静态内部类的区别
- 非安卓方法实现线程之间通信
- 发生异常时,synchroized和lock的区别
- jvm内存模型
- AsyncTask一个对象可以重复执行吗
- Handler源码
- handler的poistDealy源码
- view的绘制流程
- 执行requestLayout时,draw方法执行吗
- java和js互调及优化
- 播放器编码解码
- 弹幕流的处理
- 如何做单元测试
- 编译时和运行时
- okhttp连接复用原理
- SQLite批量插入和查询,如何优化
最后,面试前该准备哪些资源复习?
其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
这里再分享一下我面试期间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)
《Android开发七大模块核心知识笔记》
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,以上资源均免费分享,以上内容均放在了开源项目:【github】 中已收录,大家可以自行获取(或者关注主页扫描加微信获取)。