面试美团,爱奇艺等6家BAT公司收获一半Offer,这样准备面试通过率增加一半!
今天整理的这篇文章,整理自以前面试经历后的日常笔记。今天记录的是面试掌阅,马蜂窝,爱奇艺,美团,猎豹移动和摩拜一次经历以及面试记录,其中拿到了爱奇艺,猎豹移动和摩拜的Offer。
爱因斯坦说过“耐心和恒心总会得到报酬的”,我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在我身上实现了。
掌阅科技(Over)
面试机会来自于Boss
一面:
- Canvas.save()跟Canvas.restore()的调用时机
- 程序A能否接收到程序B的广播?接入微信支付的时候,微信是如何跟当前程序进行通信?
- 对Java.nio了解多少
- ConcurrentHashMap是如何实现分段锁?
- 现在需要遍历SD卡下所有的文件打印出后缀名为.txt文件名称,如何提高时间效率?
- 为什么复写equals方法的同时需要复写hashcode方法,前者相同后者是否相同,反过来呢?为什么?
- Android4.0~8.0之间大的变化,如何处理?
- 说一下Measurespec这个类
- ViewHolder有什么用?
- Gradle的Flavor能否配置sourceset?
- 线程池核心线程数一般定义多少,为什么?
- Intentservice有什么用
- 弱引用什么时候被回收
- Android中提供了哪些类来帮忙处理线程
- http的状态码,常见的请求头,http缓存协议https如何加密
- 多进程的优缺点,多线程的优缺点
- 热修复如何修复资源文件?
- 有没有遇到64k问题,为什么,如何解决?
- httpUrlconnection跟httpClient有什么区别
马蜂窝(Over)
面试机会来自于Boss
一面:
- 两个非基本数据类型数组: array1=[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,×11] array2=[x6,x3,x10,x5] 计算结果:[x6,x7,x8,x9,x1,x2,x3,x4,x10,x11,x5],写出你的算法
- 类的初始化过程
- 点击事件穿透原则
- 线程池使用的是哪一种,使用原则
- LeakedCanary原理
- LinerLayout跟RelativeLayout的绘制原理
- Android新版本的一些新特性6.0,7.0,8.0
- 类的初始化顺序依次是(静态变量、静态代码块)>(变量、代码块)>构造方法
二面:
- 看了看项目提了问题如何进行优化
- 如何实现马蜂窝中的一个动画效果
- 软键盘顶起布局
- 组件化通信方案
爱奇艺(Offer)
面试机会来自于拉勾
一面:
- 聊聊RecyclerView,动画,缓存,数据绑定底层是如何实现的。
- 聊了聊我的开源项目实现原理
- View在屏幕中的移动底层是如何实现的
- Binder跟Socket之间的区别,什么时候用哪一个,Binder的底层实现
- Activity,Window跟View之间的关系
- setContentView都干了啥
- Activity的启动模式
- MVC跟MVP之间的区别
- 算法:将一个有序数组去重得到一个新数组(空间复杂度为O(N))
二面:
- LruCache底层实现
- Hashmap的hash算法
- Bitmap在decode的时候申请的内存如何复用,释放时机
- 注解如何实现一个findViewById
- Android是如何学习的
- sycronized关键字的类锁对象锁,如何保证线程安全?
- 重入锁跟sycronized关键字之间的区别
- 除了notify还有什么别的方式可以唤醒线程
- 说说你对Context的理解
三面:
- Listview的adapter是什么adapter,如何复用。
- RV是如何布局的
- 算法:如何从1T的无序数组(长度为n)里面找出前k大的数据,复杂度要求为O(logN)
- 由A启动BActivity,A为栈内复用模式,B为标准模式,然后再次启动A或者杀死B,说说A,B的生命周期变化,为什么
美团(Over)
面试机会来自于内推
- APP启动流程
- Webview内存泄露
- 组件间通信,如何传递对象
- Arouter原理
- 如何取消一个网络请求
- 两个activity之间来回切换的生命周期变化
- 进程间如何通信,Binder机制
- 内存泄露及优化
- 自定义view以及事件冲突
- 线程池参数及定义,多线程是否一定会高效
- 电量优化
美团实际上面了三面,但是面试题跟前面的面试官很多重复的,所以就只写了上面几道题目,整体面试感觉都答上来了,但是问的有些问题确实没接触过,比如说Webview的性能优化,电量优化等,最后HR反馈的情况是基础很好,项目经验不足。
猎豹移动(Offer)
面试机会来自于Boss
笔试:
- 请例举Android中常用布局类型,并简述其用法以及排版效率
- 区别Animation和Animator的用法,概述其原理
- Thread,Looper,MessageQueue,Handler,Message每个类的功能以及这些类之间的关系
- 如何加载NDK库?如何在jni中注册native函数,有几种注册方法?
- 操作系统中进程和线程有什么联系和区别?系统会在什么情况下会在用户态好内核态中切换。
- 如果一个APP里面有多进程存在,请列举你所知道的全部IPC方法
- 请画出MVC、MVP模式的差异
- 对于Android APP闪退,可能的原因有哪些?请针对每种情况简述分析过程。
一面:
- listview跟recyclerview之间的区别,然后上拉加载的时候分别应该如何处理
- 项目中用过哪些技术
- 同步普通方法跟static方法之间的区别
- 不用锁如何保证int自增安全
- 内存为什么会发生泄露
- 做过的性能优化,原理
- DVK跟JVM之间的区别
- 有没有diss过产品经理
- 平时看什么书
- 为什么学python
- 项目中用到过哪些技术
- 期望在项目中扮演什么样的角色
二面:
- Sycronized原理
- ReentrantLock原理
- 静态内部类为什么能保证单例,JVM是如何实现的
- ART跟DVM做了哪些优化
- View是如何绘制到屏幕上的
- 写一个快排,有时间限制
三面:
- GitHub上的开源项目是如何实现的
- 未来的职业规划
- 遇到问题如何解决
摩拜(Offer)
面试机会来自于拉勾
笔试:
自己带电脑,他们提供一个接口,实现一个瀑布流,需要考虑动画,内存管理等,可以上网搜,限时90分钟 当时我去的时候出了个以外,HR给我的WiFi我没法连GitHub,当时想着用自己封装的ImageLoader,没想着直接用第三方,在使用RecyclerView的时候依赖也没法添加,所以最开始时间都浪费了,直到一面面试官下来,给我连接了他们的员工wifi,我才能添加依赖,尴尬的一比,不过到最后时间到了还是没有实现预期的效果,面试官最后问我,我说了我的考虑,他说只是想看看我解决问题的能力,完全可以用第三方,没必要自己实现,不过对我的态度还是表示认可的,然后开始一面。
一面:
- 深拷贝浅拷贝
- 输出一个集合{A,B,C,D}的全部子集
- 自定义View及注意事项
- 如何自动化部署打包发包流程
- JNI是否了解过
- 内存回收
- classloader
- 对热修复以及插件化了解多少
- 微信支付宝支付调用时上层是如何封装AIDL的
- 如何给一个app瘦身
二面:
- 如何实现一个推送,极光推送原理
- 说说Http协议,以及Tcp/Udp
- 常见的设计模式,如何实现一个观察者模式,如果需要有序通知观察者,该如何操作
- 实现一个图片加载框架应该考虑哪些
- 线程池有哪些参数,应该如何设计
- 性能优化是如何做的
- Java为什么要推出HashMap,它是如何解决hash冲突的
- JVM内存分配,编码时如何注意内存泄露
- Binder机制原理
三面:
- 为什么重复造轮子,自己去设计一些框架的原因
- 如何保证线上项目的稳定性
- 自己之前做的项目的规模
- 聊了聊他们目前在做的项目
三面面试官跟我聊了聊一些新技术,还有就是我自己为什么要重复造轮子,我说为了保证项目的稳定性同时能够更好地去定位问题,然后聊了聊他们目前在做的项目,整体感觉特别好。
面试之外的学习心得
1.好记性不如烂笔头
这句谚语,几乎无人不知无人不晓,但是总被许多初学者抛在脑后。在学习的时候,总是看的代码多,而动手练习的代码少!身为一个程序员都应该很清楚,代码如果不多动手敲它,它永远不会自己跑进脑中,所以多动手才是成功的关键。
2.花更多的时间分析问题
花更多的时间理解和分析问题,然后再设计方案吧。你会发现剩下的事情很容易了。设计不是说要用建模语言和工具,可以是仅仅看看天空在脑子里构思。那些在遇到问题就开始敲代码的人往往会最终偏离需求。作为程序员,当你在编写代码之前,尽量把问题分析透彻一点,这不仅能提高你编码的效率,更重要的是能提高你的分析问题能力。
3.重思考,多总结
一个段好的代码并不是它们越复杂越好,简单的方法,实现复杂的功能,才是我们最需要的。要提高编码速度,更重要的是简化梳理程序流程,以最小的代码量完成功能实现。所以编程最重要的事情是思考和总结。
最后
最后这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~
2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2020年万事大吉。