我毕业走出学校已有五年了,真想在回到大学时代,去谈一场轰轰烈烈的恋爱…… 而不会像现在是一个没人疼没人爱的单身狗!
在这个五年的时光里,我一直在Android 行业摸爬滚打,待过的公司差不多有五六家了,待得最久的一家时长好像是一年多,基本都是中大型的公司。在进入这些公司前,少不了的肯定是面试环节,而在这些年内去面试的公司也比较多。如何要说具体多少家公司的话,说实话我自己也记得不是很清楚了。但是近一年中我去面试的公司,我是有所简单的记录。
想在金三银四面试的这个季度,通过这篇文章分享给大家做个参考,失败和成功的面经案例都有,我们一起往下看吧。
面试前期准备
相信大家在面试前都会一个备战的预习期,因为大家都想把Offer拿到手,然后自己进行去挑选公司,这个周期的长短不宜过长。其实在这个期间最重要的是,给自己做好一份优质的简历,HR或者面试官第一眼见的就是你的简历,从简历中进行筛选确定是否通知你来面试,这个是最关键的一步。二就是对自己简历中所记录熟知的技术点和项目进行复习,从网络上去找相关的面试题进行刷。还有就是回想之前做的项目中遇到的一些问题,自己是如何去解决,这个是面试官跟你聊项目中可能会问到的。
面试过程(不分时间先后)
小米(三面)
一面
两个面试官(一个我们小组Android的leader,一个是同事),上来先当着他们的面写了一个笔试题(都是很基础的题没啥难度,算法题也就是一个list的反转,但是小米比较注重手写代码的一些细节,所以要考虑好该判空的判空,还有防止越界啥的问题),然后就开始问,90%都在问Java基础(GC的机制,GC算法,内存相关的问的比较多,多线程线程安全问题是如何发生的,HashMap的原理)
二面
我们组的主管(全程聊项目,没有问技术相关的了,然后介绍了一下这个部门的工作内容啊之类的)
三面:
本来应该有三面…三面是我们部门的领导,但是因为一些其他的原因吧,三面就没有面直接过了
感受:
其实自已算是运气好,遇到的问题算是偏容易的,要多看看算法方面的视频
腾讯音乐(5次技术面)
面试内容:
1.activity和service的生命周期与使用场景
2.thread和服务的差别,单例的类型,多少种?优缺点说一下死锁的原因,与场景,单例的使用场景
3.使用过啥来源框架,有啥特点,为什么,从中学到了什么。
4.kotlin的特点与java的差别,
5.三种架构的区别handler和view的原理,
6.线程池原理与种类
7.javastackoverflow的原因
8.性能优化和卡顿优化的实际案例
9.虚拟机的构成与原理
10.热修复和插件化的区别与原理
11.rxjava源码
12.多线程应该注意的问题
13.databinding原理
14.binder原理
15.网络方面知识
16.平时解决问题的流程
感受:
掌握基础知识很重要,算法也有问到,还有就是开放式问题,他想知道我怎么解决问题的一个过程,怎么发现和定位,平时学习的方法。
美团
1.java的话static变量各种访问可见性,final关键字的作用,封装继承多态展开问,多线程通讯,线程池原理,线程同步方式,jvm内存模型,常见的gc算法,类加载过程
2.网络的话主要是问的https,http1/2/3的区别特性 Android问了一些常见的handler原理,recycleview缓存机制,view事件的分发
3.glide缓存机制
4.然后引申如何实现我LRU。内存泄露和如何预防处理,
5.算法的话,有top-k排序(堆排序,位图法),旋转输出矩阵,链表逆序,hashmap concurrenthashmap原理,线程安不安全,它的锁机制等等
华捷艾米(基础面)
1.冒泡排序,堆排序算法
2.平衡二叉树和红黑树的区别
3.多线程,用过哪些并发api?踩过哪些坑?
4.C++的 指针和引用的区别
5.手写对赋值运算符重载
6.GC 会不会把所有线程暂停?
7.GC不同时期有何区别?
8.说一下Handler Looper的休眠机制
9.设计一个算法,已知某年某月某日是星期几,求另外年月日对应的星期几。
厦门美图
1.多线程
2.handler
3.网络请求
4.性能优化
5.view绘制
6.opengl部分
7.camera相关
8.自定义view
9.asyncTask
10.图片加载框架原理
汇丰银行
1.线程池的工作原理 2.synchronized锁方法和锁静态方法有什么区别
3.锁的理解,什么是乐观锁,悲观锁,可重入锁。
4.View的事件分发流程
5.View的三种测量模式理解,什么时候会发生Excatly
6.HashMap的工作原理。
7.怎么实现多线程下载,断点续传怎么实现。
8.rxjava的背压了解吗
9.kotlin的协程,怎么做到和rxjava的zip操作一样,等待所有结果后再处理。
盒马生鲜
1.bitmap在内存中的大小计算
2.系统级的全局异常如何捕获打印堆栈?
3.APT技术原理(这个居然忘了?)
4.如何中断一个线程?AsyncTask如何中断?(加标记位中断)
5.CoordinatorLayout滑动机制?两个CoordinatorLayout嵌套如何通过事件分发传递处理滑动?父View中嵌套子View,快速滑动fling状态,如何处理在父View到顶部停止滑动,子View继续滑动?
6.Flutter热重载原理
7.组件化用了什么技术?实现原理是什么?
8.如何分析主线程中的消息队列耗时情况
9.绘制优化、APP启动优化,activity跳转启动速度优化?(网络请求可不可以放在setContentView之前?)
10.如何实现旋转动画?(帧动画、属性动画、gif、Lottie动画框架)
11.GC分代回收介绍?Eden和survivor为什么是8:1?老年代存活下来的会进入永久代么?
12.如何修改JVM内存分配?(AS中在vmoptions修改,gradle.properties) 13.Android9.0隐藏的属性方法是咋反射获取的 (原理居多)
小红书
(1)concurrentHashMap 如何加锁的
(2)measure参数详解,view设置wrap不起作用
(3)Bind service,如何实现保活
(4)两个进程act,如何加快启动速度
(5)性能优化(面试官老插嘴,都说不上话)
(6)Eventbus如何实现线程的切换
(7)jetpack的Navigation的xml引用,在什么时候调用的?
(8)Inflater.inflate如何实现xml转java的(framework),方法中的各个参数含义。
京东(凉经)
(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能实现防止指令重排,指令级别如何实现的,对象的创建过程等(多家都问了,很深入)
shopee基金
shopee一面:
1.java的四种引用分析
2.synchronize和volatile各自的机制是怎样的
3.handler源码原理相关的问题
4.自定义view的绘制,事件分发机制,怎么解决滑动冲突,activity启动的过程
5.https单向认证,对称加密和非对称加密,在浏览器输入url发生了什么
6.jvm相关,如new一个对象的过程发生了什么,垃圾回收机制
7…问了关于线程池的一些问题
8.跨进程通信有什么方案
9.binder机制
10.hashmap源码
11.用什么方案缩小apk体积
12.recyclerview和listview对比
13.做过什么内存优化,性能优化
14.okhttp源码设计原理
15.手写一道算法题,关于DFS+回溯算法的
shopee二面:
1.问了之前的一些项目经历,在团队做了什么,主要负责哪一块,选择一两块自己认为做得最好的展开讲讲,过程中会打断问问题
2.有没有做过插件化,做到什么程度,讲讲原理
3.由于我之前项目有用到mvvm和jetpack,问了一些jetpack组件相关的源码,和mvvm跟mvp的对比
4.又问了okhttp,缓存拦截器原理是怎样的
5.项目中做过什么性能优化,具体说说
6.平时项目中用到什么设计模式,挑几个常用讲讲
7.聊人生聊职业规划
WPS
1.线程切换(handler机制)
2.多线程,几种锁,有什么区别
3.如何实现线程排队
4.Https加密机制
5.项目经验
6.Okhttp原理 7.设计一个线上日志收集系统
8.项目经验
9.Activity启动流程
10.性能优化
11.Viewstub实现原理,自己设计一个类似的
12.Https如何保证安全的,如何防止中间人攻击,可以伪造证书吗
13.Looper死循环为什么不会导致主线程卡死
14.epoll机制是怎么样子的
15.热修复资源id冲突怎么解决
16.AIDL如何实现的
17.Binder原理
字节跳动
一面:
1.SharedPreferences线程安全吗
2.SharedPreferences多进程调用会有问题吗?如果需要多进程调用,怎么实现
3.自己在项目代码中写一个java.lang.String类会有问题吗
4.内存泄漏除了用LeakCanary还有没有其他办法检测
5.如何监控线上内存泄漏
6.native的内存泄漏怎么监控
7.如何监控线上OOM,如何知道是哪里造成的OOM
8.Error和Exception的区别
9.怎么监控应用中的线程,都是在哪创建的(AOP)
10.post一个延迟5秒的消息,怎么做到5秒后才执行的
11.同步屏障原理
12.ContentProvider初始化的时机
13.组件化-A组件要调用B组件的某个功能,怎么调用(回答了接口下沉,AutoService等等)
14.组件化-如果不用接口下沉,没有任何依赖,怎么方便的调用(不让用反射,太麻烦)
15.A进程调用B进程的b方法(AIDL实现的,B进程有个服务),B进程没有创建的情况下,B进程中是b方法先执行还是Application的onCreate方法先执行?16.如果b方法很耗时,A进程会被阻塞住吗
17.算法:写一个二叉树的层序遍历
18.数据库的索引原理
19.B+树和二叉树的区别,性能对比
20.HashMap的缺点,怎么解决
21.ArrayMap的原理,为什么内存消耗低
22.flutter与其他跨平台方案对比,flutter为什么好(除了跨平台),跟原生的性能比怎么样
23.硬件加速的原理
二面:
1.触摸事件中的cancel事件什么时候触发
2.handler延时消息怎么实现的
3.主线程有好多handler,分发消息的时候怎么知道给哪个handler
4.主线程每5秒钟发一个需要执行10秒的消息到子线程,会发生什么
5.实现了AIDL接口的服务的方法是运行在哪个线程?有多个方法,是不是运行在同一个线程?
6.Binder通讯中,客户端调用服务端是阻塞的吗?怎么做到不阻塞?
7.bitmap的像素数据在哪里?一直申请bitmap会oom吗?
8.view的绘制刷新机制是怎么样的?vsync信号发出后怎么触发绘制逻辑的?
9.页面静止的时候,onDraw会执行吗?vsync信号会发吗?
10.vsync信号发出的时候,怎么控制需不需要onDraw?
11.用canvas怎么绘制一个倒影
12.对canvas做矩阵变换的matrix有哪些参数配置
13.做过哪些性能相关的优化
14.怎么分析anr问题
15.如果是死锁导致的anr,在日志上怎么看
16.应用启动速度怎么优化
17.没有内存泄漏的情况下,应用占用内存比业内其他应用内存要多,怎么分析优化
18.布局层级太多怎么优化
19.页面内有一些不需要每次都显示的view,怎么优化
20.recyclerview里面的图片显示速度比较慢,怎么优化
21.做过的最复杂的项目
22.工作几年中自身提升比较大的地方
23.JavaScript中bind,call,apply的区别
24.RxJava中的背压是什么意思
25.flutter有了解吗
26.最近有学习什么
27.mvvm与mvp的区别
28.装饰模式和代理模式的区别
三面:
1.介绍在上一家公司做的app,app的crash率是多少
2.详细介绍最有技术难度的项目
3.应用crash的本质原因是什么
4.重写和重载的区别,应用场景
5.hybrid开发中遇到了什么问题
6.线性布局和相对布局那个性能更优
7.js和java之间传递大对象会怎么样,怎么保证传输性能
8.activity横竖屏切换会发生什么?怎么避免
其实还有几家小型公司的面试,我就不在此一一的说明了,因为文章篇幅长度有限,所以就挑选了几个自己觉得面的还不错的公司进行跟大家分享,大家可以参考这些面试题,去进行记录学习,可能对你将来面试是有帮助的。
推荐分享
之前在做面试准备的时候,从网上查找收集整理了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,进行刷题复习 Android 相关的知识,通过这次的面试效果检测,也体验出了结果。这次面试能通过一半原因是自己的技术还过的去,另一半的原因就是吸收了这些学习文档精华。
所以我想拿出来跟大家进行分享,希望能帮助到大家学习提升,在面试中能顺利通过。如有需要参考的可以微信扫描下方二维码即可免费获取!