2019 年对我来说是最幸运的一年,在这一年我多了一个「小情人」。然而,刚忙完回到公司的第二周,我接到了最残酷的通知,公司经济状况不佳 —— 裁员!
虽然可以选择降薪留下来,但是社保公积金最低,还需要996,无奈只好选告别了待了三年之久的 xxx,没有 n+1,没有 xxx,mmp。
由于离职时间点比较尴尬,马上就是中秋节,刚好可以放松下回家陪陪家人。
中秋过后,尝试投了几份简历,但是效果不太好,面试机会也不多,可能是由于马上就是国庆长假的缘故(也只能这样安慰下自己)。
下面是我面试全部之后整理的面试题,把一些重要的面试题给记了下来,有一些已经忘记不过不碍事,是一些比较简单大家都能答上来的,希望这些面试题能给之后面试的朋友们一点帮助。
注意文末的准备与建议,还有整理好的面试PDF文档分享~
优贝在线
- Android 项目中 asset 目录和 res 目录有什么区别
- 面向对象的特征,并举例说明面向对象的过程
- 如何结束一个正在运行的线程
- 简述 MVC 和 MVP,并说一下 MVP 的优点
- 如何获取某个 View 的大小并动态改变 View 的大小
- join()、wait()、interrupt()
- 二维数组旋转
- 有一群人A与B有关系,B与C有关系...分成两队,让彼此都有关系
这是一个神奇的公司,只怪自己太菜笔试都没有过,出师不利啊。然而奇怪的是国庆后,该公司的HR找了我不下3次。
三节课
- String、StringBuilder、StringBuffer 区别
- ArrayMap、HashMap、SparseArray 原理
- Fragment 添加方式,add、replace、show 区别
- volatile 关键字作用
- Binder 机制
- HTTP 版本之间区别
- invalidate()、requestLayout() 区别
- View 绘制流程
- 事件分发机制
- 渲染优化
- ArrayList 怎么实现线程安全
必要商城
- Android 线程间通讯方式有哪些?
- 类B继承A,A、B两个类中都有静态变量、成员变量、静态代码块、构造方法执行顺序是什么?
- Java代码执行时内存状况
- Activity生命周期其他函数
- View什么时候绘制完成?
- 如何获取一个View的尺寸?
展心展力
- Handler 机制,一个线程几个 Looper,几个 Handler,Looper 如何确定是哪个 Handler?
- 内存溢出、内存泄漏的关系
- volatile、synchronized关键字的区别
- 垃圾回收机制,垃圾回收算法优缺点
- Java内存模型的理解
- HashMap实现原理,如何计算key的index,存储方式
- 一个无限单向链表如何计算长度,如果有环如何计算长度
- RelativeLayout与LinerLayout的区别
- View绘制原理
- 事件分发机制,Activity怎么处理的
团车网
- 自定义 View 流程
- View 绘制原理
- 事件分发机制
- AMS、WMS
- Handler 机制
- JMM
- 锁机制
- AQS
- 内存优化怎么优化
- 项目中遇到的最大的问题是什么?怎么解决的
- 如果遇到项目进度无法推进,你怎么做的
- 你对近五年的规划
某课
- Handler postDelay() 然后finish当前Activity会怎么样?
- View 绘制流程
- invalidate()、postInvalidate()、requestLayout()
- Tinker 为什么需要重启
- volatile、synchronized
- Java内存模型
这是我迄今体验最差的面试没有之一,面试官特别装逼,一直问我 API 细节,方法里有什么代码。最后面试官竟然 JVM 运行时内存区域和 JMM 都分不清,我实在忍不住了反问了一句:公司难道是在招 API 工程师吗?
诸葛找房
- 事件分发机制
- HTTP 响应吗
- Handler 机制
- 手写排序算法
- 常用设计模式
异乡好居
- http https
- js webview交互
- handler为什么不卡死
- App启动流程
- 自定义view过程
- 动画原理
- 事件分发机制
- 混淆怎么处理
- 设计模式
- 对跨平台技术的了解
FineChart
- HTTP、HTTPS区别
- HTTP报文
- 手写反转链表
- 手写单例模式
- volatile关键字原理
- 事件分发机制
- App启动流程
- 项目天气曲线实现原理
- 第三方开源库实现原理
- 线程池原理
- wait()、sleep()区别
- 项目中最大的困难是什么?怎么解决的?
- 常用集合类实现原理
- ConcurrentHashMap原理
阿里体育
电面
- List、Map、Set 哪个能存null,哪个能重复?
- 补间动画与属性动画的区别
- Handler 机制
一面
- 怎么实现View悬停?
- TCP怎么做长连接?
- 网络优化
- 热修复原理
- Instant Run原理
- 视频做过吗?
- 相机做过吗?
- LinkedHashMap、HashMap实现原理,区别是什么?
二面
- Android与iOS相比有什么差别
- Android与iOS系统内存管理机制了解吗?
- 常见算法了解哪些,时间复杂度是什么?
- 项目中遇到的困难是什么?怎么解决的?
- 你最大的优势是什么?
- 对于其他同事,为什么你觉得你这个优势最突出?
不得不承认阿里实力还是很强的,也可能我投的岗位期望 P8 以上水平的缘故,被虐的很惨。突然感觉这几年都荒废了,选择大于努力,一定要选择好的方向,比如我选择小程序就是一个错误。
多点科技
一面
- HashMap、ArrayMap
- Handler、IdleHandler、postDelay
- View 绘制原理
- 事件分发机制
- 如果子View已经处理了事件,父View怎么拦截子View事件
- Binder机制
- 线程池原理
- 垃圾回收机制
- 类加载机制
二面
- OkHttp、Retrofit、Glide、ButterKnife、EventBus、RxJava
- Jetpack、LiveData、ViewModel
- ArrayList、LinkedList
- Material Design
- Java并发编程(JMM)
- MVP、MVVM区别
HR面
- 期望什么样的领导?
- 期望加入什么样的公司?
- 拿到几个Offer了?
- 期望薪资?
董事之一
- 介绍了下公司的发展前景,公司的优势
- 对未来工作的期望?
- 聊了将近一个小时...
美餐网
- 怎么判断二叉搜索树是否合法,白板手写出解法
- 给出一个业务场景怎么处理
你没有看错,就只有两道面试题,白板手写代码,这是我遇到的最奇葩的公司了,最后还说我代码写的不讲究(这 tm 是面试吧,我已经说了由于篇幅有限,一些细节就忽略了),太浪费时间了。
360
一面
- 线程状态转换图
- Activity生命周期,一个Activity启动另外一个Activity生命周期函数调用
- Activity启动模式,onNewIntent() 调用时机
- 动画有哪些,实现原理
- setContentView()后面的流程
- Handler机制,Looper与ANR
- 过度重绘、UI卡顿
- WindowManager.addView(),View.getParent()是谁?
- JMM理解
- Lock机制
二面
- 内存泄露、内存溢出
- 类加载机制、双亲委派模型
- CAS
- 有多个线程1、2、3、4,1、2、3 并行完后与 4 串行,至少 3 种方式实现
- 网络参考模型
- HTTP、HTTPS传输过程
- TCP三次握手、四次挥手
- 用过哪些设计模式
- 根据简历多渠道包怎么构建的
- 反射原理
三面
- 一般都是根据简历问
- 对大前端技术的了解
- 类加载机制
- 对JDK各版本差异的了解
- Android系统启动流程
- AMS、WMS
- 对Framework层源码的了解,为什么这么设计,优缺点
关于准备
每个人应聘的职位级别不一样,需要准备的范围也有所不同。我应聘的是高级职位,主要准备了以下几点:
Java 基础
一般都会问 Java 虚拟机相关知识:类加载机制、双亲委派模型、垃圾回收机制、运行时内存区域、注解、泛型、反射等等。强烈建议精读一下《深入理解 Java 虚拟机》这本书。
Java 并发编程也是高级必问知识:Thread生命周期、JMM、volatile、synchronizied、final、JUC、Lock、线程池等等。推荐看一下《Java 并发编程的艺术》。
Android 基础
这部分内容比较多,还是需要平时多积累,养成看源码的习惯。
现在一般都不仅仅问原理是什么了,比如 View 绘制原理会问 requestLayout() 和 invalidate() 什么区别?什么情况下 requestLayout() 会执行 onDraw() 方法?
Handler 机制大家都会说,网上找找都能找到,现在会问一个线程几个 Looper,几个 Handler?Looper 中的死循环为什么不会卡死主线程?IdleHandler 的原理?发送延时消息怎么处理的?
如果你能从 Handler 答出 epoll 机制,接下来会问 epoll 机制的原理,有没有看过源码?
高级岗位 Framework 层原理肯定逃不过的,系统启动流程、Binder、AMS、WMS 都是最基础的,最好有一个自己深入研究的方向,比如 SurfaceFlinger。
进阶一定要看刚哥的《Android 开发艺术探索》必备,Framework 部分《Android 内核剖析》、《Android 源码情景解析》、《深入理解 Android》系列等都是很不错的书籍。
网络基础
面试中一般会问 HTTP 的三次握手、四次挥手过程,以及为什么?HTTPS 的通讯过程?等等。
网络是个大方向,对于 Android 工程师来说,常见的概念必须要了解的,当然深入研究一下也是很不错的加分项。就像直播,网络优化等方面都离不开网络知识。
推荐看一下《图解 HTTP》、《图解 TCP/IP》,向深入研究可以看《TCP/IP 详解》、《UNIX 网络编程》。
数据结构与算法
数据结构计算机专业的一般都是必修课,网上资料很多这里放上我收集到的一些资料,文末自取。
面试中数据结构一般会问 Java 集合类:ArrayList、HashMap、ConcurrentHashMap 等等,常见的高频算法题一定要准备下。
算法可以看看《算法》、《算法导论》、覃超的《算法面试通关 40 讲》、刷下 LeetCode。
设计模式与架构
设计模式一般会问你在项目中常用的设计模式有那些?等你说完之后会问你怎么用的,什么场景用的?它的优缺点是什么?遵循了什么原则?违背了什么原则?...
架构 MVC、MVP、MVVM 烂大街的问题,一般会问它们的优缺点各是什么?
总结
虽然后面还有好几家面试,也有像豹厂这样的很不错的公司。但不得不承认一天面两家,一周面 10 多家实在太累了。
在收到大数字公司的 Offer 后就没有再面了,加上 HR 将近五轮的面试聊得过程都很愉快,大数字公司也是我比较理想的公司。
虽然在之前也收到了几家很不错 Offer,相比之下还是大数字公司比较适合我,接下里的几年也需要好好沉淀一下技术了。
经过这一次的被动面试经历,我个人感受有以下几点:
一定不要裸辞
如果是裸辞找工作,HR 一般都会问什么时候离职的。如果手里没有 Offer,就很被动了,很有可能被压薪资。主动权一定要掌握在自己手中。
选择大于努力
即使很努力如果方向错了就是浪费时间,就像我选择了小程序就是个错误(大前端坑太多,入坑需谨慎)。我的建议是多深入研究一些以不变应万变的技能。
学历与履历
虽然说能力很重要,但学历是敲门砖(HR 就看这个)。如果连面试机会都没有,还怎么谈然后?如果学历不突出有很好的大厂履历也很不错,貌似是个蛋生鸡,鸡生蛋的问题。
充分准备
一些基础知识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,我能明显感觉到国庆后多了很多高级职位,所以努力让自己成为高级工程师才是最重要的。
好了,希望对大家有所帮助。
接下来是整理的一些Android学习资料,有兴趣的朋友们可以关注下我【主页的简介】查看免费领取方式。
《Android学习PDF+架构视频+面试文档+源码笔记》
①Android开发核心知识点笔记
②面试精品集锦汇总
获取方式:关注我 主页 查看免费领取方式!