7.牛批了 Android 2022高级资深面试题 一线大厂和二线大厂面试真题精选 (大疆 附答案)第七套 30k+

笔者是面霸,面试500+场       当过考官:面过别人500+场     去过500强,也呆过初创公司。
斩获腾讯、华为、字节跳动,蚂蚁金服,OPPO,美团,安卓岗offer!我有一套速通大厂技巧分享给你!

12年毕业,专科生,做安卓9年了。横扫深圳各大互联网公司,从开始的4k工资到现在的4万。我经历了什么?

本人也是一个屌丝,刚毕业的时候一直沉迷泡妞,我一直换,换了9个女朋友,然后在去年深圳买房安定下来了。然后开始写博客。免费分享给大家!
本系列一共10套面试真题,适合快速找工作的人准备,薪资和公司分别如下。
搞定前3套,可以去二线大厂,秒杀70%公司
搞定前6套,可以去二线和一线大厂,秒杀80%公司 ,面试官在你面前都是弟弟
搞定前10套,一线大厂,秒杀100%公司,中国互联网任你挑 ,横扫北上广深,吊打面试官
第一套平安科技   价值22k+, 难易程度:简单      看完你能进这些公司:平安,珍爱网,步步高,优必选科技,柔宇科技,迅雷,芒果网,吉比特,传音控股,海能达,金蝶,有赞
第二套京东         价值22k+,   难易程度:简单     看完你能进这些公司:京东 ,联想,旷视,优酷,58同城,贝壳找房,作业帮,创新工场,金山,唯品会,猎豹,科大讯飞,格力
第三套顺丰         价值25k+,   难易程度:中等      看完你能进这些公司:顺丰,网易 ,海康威视,斗鱼,小红书,去哪儿,喜马拉雅,创维,涂鸦智能,51信用卡
第四套Shopee    价值27k+,   难易程度:中等      看完你能进这些公司:Shopee,京东, 深信服,TCL,平安,荣耀,  美的,一加,随手记,中兴,虎牙
第五套美团         价值28k+,   难易程度:中等      看完你能进这些公司:美团,大疆,顺丰,恒大,携程,货拉拉,知乎,爱奇艺
第六套OPPO       价值28k+,   难易程度:中等      看完你能进这些公司:Oppo,VIVO,360,新浪,拼多多,携程,微博,哔哩哔哩
第七套大疆           价值30k+,   难易程度:难         看完你能进这些公司:大疆,京东, 美团,爱奇艺,小米,拼多多,恒大,万科
第八套 腾讯           价值35k+,   难易程度:难        看完你能进这些公司:腾讯,阿里巴巴,抖音,快手, 百度,美团,华为, 滴滴         等国内所有企业
第九套 字节跳动     价值38k+,   难易程度:难      看完你能进这些公司: 腾讯,蚂蚁金服,今日头条,快手,百度,华为, 美团,滴滴    包含以上所有企业
第十 套 蚂蚁金服    价值40k+,   难易程度:难       看完你能进这些公司:腾讯,支付宝,字节跳动,快手,华为,滴滴,美团,百度       包含以上所有企业
我把面试厂商分为3类,一线大厂和二线大厂 

一类:腾讯,支付宝,头条,快手,OPPO,VIVO, 百度,华为二类A组:北京:滴滴,京东, 美团,爱奇艺,小米,拼多多,360,新浪,携程,微博,哔哩哔哩 ,搜狐,知乎,联想,旷视,优酷,58同城,贝壳找房,作业帮,创新工场,金山深圳:大疆,顺丰,恒大,万科,货拉拉,TCL,平安,荣耀,  美的,Shopee,一加,随手记,中兴广杭:网易 ,海康威视,斗鱼,小红书,去哪儿,喜马拉雅,创维,虎牙,涂鸦智能,51信用卡,猿辅导二类B组:海能达,金蝶,有赞,富涂,深信服,广和通, 移卡,珍爱网,步步高,优必选科技,柔宇科技,迅雷,芒果网,吉比特,传音控股唯品会,猎豹,科大讯飞,格力

强调:一定要搞的非常清晰,细节一个都不能放过,要非常深入,仅仅10题而已
1.mvp与mvvm的区别,mvvm怎么更新UI,databinding用得多吗,databinding的原理?
2..SharedParence可以跨进程通信吗?如何改造成可以跨进程通信的.commit和apply的区别.
3.Jvm的内存结构,Jvm的垃圾回收,方法区有什么东西?哪些可是GC root
4.viewpager切换掉帧有什么处理经验?
5.热修复的原理,资源的热修复的原理,会不会有资源冲突的问题
6.http1.0,http1.1,http1.2有什么区别 编译时注解与运行时注解,为什么retrofit要使用运行时注解?什么时候用运行时注解?
7.A、B、C、D分别是四种Activity的启动模式,那么A->B->C->D->A->B->C->D分别启动,最后的activity栈是怎么样的
启动模式及其用法。A应用的A1页面启动B应用的B1页面,A1和B2都是standard模式,B1启动后B1在那个任务栈,按下back键后显示那个页面,再按一次back键呢?
8.binder 复习stub proxy代表的含义
9.有什么实际解决UI卡顿优化的经历
10.给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。
candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。 
对于给定的输入,保证和为 target 的唯一组合数少于 150 个。
总结:资深面试题都是设计,灵活性比较高的题目。没有那种死记的题目
1.mvp与mvvm的区别,mvvm怎么更新UI,databinding用得多吗,databinding的原理?
答:他们之间最大的区别是MVP会持有抽象的View,直接调用 View 中的一些接口方法来实现
而MVVM使用了双向绑定(data-binding),只是充当了View和Model之间的媒婆,一旦牵线成功就没媒婆什么事了,Model的变动,自动反映在 View上,反之亦然。
mvvm更新UI: ViewModle里面的 MutableLiveData变化后进行UI更新
databinding原理:DataBinding使用的主要技术点,Java APT,观察者,注解等
DataBinding在编译时会生成一个ViewDataBinding的子类xxBinding,例如ActivityMainBinding,
ActivityMainBinding默认持有了View和Model和Activity/Fragment,
在ActivityMainBinding里面有个关键方法,excuteBinding(),在这里为View设置值,同时设置了BindingAdapter和InverseBindingLinstener,
如上图所示。BindingAdapter主要是提供了View的set get方法和状态Linstener。
2..SharedParence可以跨进程通信吗?如何改造成可以跨进程通信的.commit和apply的区别.
答:不行,之前有个参数可以设置,现在废弃了
通过contentProvider实现,提供接口,类似数据一样。插入,更新和获取
SharedPreferences做了内存缓存。
commit:将同步的把数据写入磁盘和内存缓存
apply:把数据同步写入内存缓存,然后异步保存到磁盘,可能会执行失败,失败不会收到错误回调
3.ARouter的原理, ARouter怎么实现接口调用,ARouter怎么实现页面拦截
答:原理:1).编译时候通过APT,注解处理器,javapoat生成.java文件
2).启动的时候,初始化,把生成路由表,通过map集合实现。存放:modele。路径。一一的映射关系
3).跳转的时候,通过key,找到对应的路径,然后进行跳转
ARouter实现接口调用:使用通过实现接口iprovider.通过接口+实现的方式
ARouter怎么实现页面拦截:AOP,动态代理的方式
4.IdleHandler应用场景
答:启动优化,空闲时候调用

IdleHandler 是 MessageQueue 的静态内部接口。

IdleHandler,这是一种在只有当消息队列没有消息时或者是队列中的消息还没有到执行时间时才会执行的 IdleHandler,它存放在mPendingIdleHandlers队列中。

平时是如何使用的:

Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {

@Override

public boolean queueIdle(){

//空闲时处理逻辑

return false;

}

});

从之前的类定义可以看出,返回 false 表示执行后就将该回调移除掉,返回 true 表示该 IdleHandler 一直处于活跃状态,只要空闲就会被回调。

5.讲一下RecyclerView的缓存机制,滑动10个,再滑回去,会有几个执行onBindView
答:

1)首先说下RecycleView的缓存结构:

Recycleview有四级缓存,分别是mAttachedScrap(屏幕内),mCacheViews(屏幕外),mViewCacheExtension(自定义缓存),mRecyclerPool(缓存池)

  • mAttachedScrap(屏幕内),用于屏幕内itemview快速重用,不需要重新createView和bindView
  • mCacheViews(屏幕外),保存最近移出屏幕的ViewHolder,包含数据和position信息,复用时必须是相同位置的ViewHolder才能复用,应用场景在那些需要来回滑动的列表中,当往回滑动时,能直接复用ViewHolder数据,不需要重新bindView。
  • mViewCacheExtension(自定义缓存),不直接使用,需要用户自定义实现,默认不实现。
  • mRecyclerPool(缓存池),当cacheView满了后或者adapter被更换,将cacheView中移出的ViewHolder放到Pool中,放之前会把ViewHolder数据清除掉,所以复用时需要重新bindView。

2)四级缓存按照顺序需要依次读取。所以完整缓存流程是:

  1. 保存缓存流程:
  • 插入或是删除itemView时,先把屏幕内的ViewHolder保存至AttachedScrap
  • 滑动屏幕的时候,先消失的itemview会保存到CacheView,CacheView大小默认是2,超过数量的话按照先入先出原则,移出头部的itemview保存到RecyclerPool缓存池(如果有自定义缓存就会保存到自定义缓存里),RecyclerPool缓存池会按照itemview的itemtype进行保存,每个itemType缓存个数为5个,超过就会被回收。
  1. 获取缓存流程:
  • AttachedScrap中获取,通过pos匹配holder——>获取失败,从CacheView中获取,也是通过pos获取holder缓存
    ——>获取失败,从自定义缓存中获取缓存——>获取失败,从mRecyclerPool中获取
    ——>获取失败,重新创建viewholder——createViewHolder并bindview。

3)了解了缓存结构和缓存流程,我们再来看看具体的问题
滑动10个,再滑回去,会有几个执行onBindView?

  • 由之前的缓存结构可知,需要重新执行onBindView的只有一种缓存区,就是缓存池mRecyclerPool

所以我们假设从加载RecyclView开始盘的话(页面假设可以容纳7条数据):

  • 首先,7条数据会依次调用onCreateViewHolderonBindViewHolder
  • 往下滑一条(position=7),那么会把position=0的数据放到mCacheViews中。此时mCacheViews缓存区数量为1,mRecyclerPool数量为0。然后新出现的position=7的数据通过postion在mCacheViews中找不到对应的ViewHolder,通过itemtype也在mRecyclerPool中找不到对应的数据,所以会调用onCreateViewHolderonBindViewHolder方法。
  • 再往下滑一条数据(position=8),如上。
  • 再往下滑一条数据(position=9),position=2的数据会放到mCacheViews中,但是由于mCacheViews缓存区默认容量为2,所以position=0的数据会被清空数据然后放到mRecyclerPool缓存池中。而新出现的position=9数据由于在mRecyclerPool中还是找不到相应type的ViewHolder,所以还是会走onCreateViewHolderonBindViewHolder方法。所以此时mCacheViews缓存区数量为2,mRecyclerPool数量为1。
  • 再往下滑一条数据(position=10),这时候由于可以在mRecyclerPool中找到相同viewtype的ViewHolder了。所以就直接复用了,并调用onBindViewHolder方法绑定数据。
  • 后面依次类推,刚消失的两条数据会被放到mCacheViews中,再出现的时候是不会调用onBindViewHolder方法,而复用的第三条数据是从mRecyclerPool中取得,就会调用onBindViewHolder方法了。

4)所以这个问题就得出结论了(假设mCacheViews容量为默认值2):

  • 如果一开始滑动的是新数据,那么滑动10个,就会走10个bindview方法。然后滑回去,会走10-2个bindview方法。一共18次调用。
  • 如果一开始滑动的是老数据,那么滑动10-2个,就会走8个bindview方法。然后滑回去,会走10-2个bindview方法。一共16次调用。

但是但是,实际情况又有点不一样。因为Recycleview在v25版本引入了一个新的机制,预取机制

预取机制,就是在滑动过程中,会把将要展示的一个元素提前缓存到mCachedViews中,所以滑动10个元素的时候,第11个元素也会被创建,也就多走了一次bindview方法。但是滑回去的时候不影响,因为就算提前取了一个缓存数据,只是把bindview方法提前了,并不影响总的绑定item数量。

所以滑动的是新数据的情况下就会多一次调用bindview方法。

5)总结,问题怎么答呢?

  • 四级缓存和流程说一下。
  • 滑动10个,再滑回去,bindview可以是19次调用,可以是16次调用。
  • 缓存的其实就是缓存item的view,在Recycleview中就是viewholder
  • cachedView就是mCacheViews缓存区中的view,是不需要重新绑定数据的。
6.http1.0,http1.1,http1.2有什么区别 编译时注解与运行时注解,为什么retrofit要使用运行时注解?什么时候用运行时注解?
答:http1.0:无状态,无链接
http1.1:支持keep-alive ,串行, 支持断点传输
http1.2 支持多路复用,并行。还有其他头部压缩
7.A、B、C、D分别是四种Activity的启动模式,那么A->B->C->D->A->B->C->D分别启动,最后的activity栈是怎么样的
答:分很多种情况,
B--A--C--D,D--C---B----A
8.binder 复习stub proxy代表的含义
答:它们是生成的java里面的2个类
stub :Stub是用于在服务端进程创建的对象 。得到代理,调用remote的onTranslAct方法
proxy:是用于在客户端进程创建的代理对象  。代理,先序列化。在里面调用translact方法
是服务端的Stub对象在客户端进程的代理对象,客户端进程通过Proxy对象发出方法调用然后通过Binder驱动后最终调用服务端进程的Stub对象的方法。每一个Stub远程对象都在客户端进程中对应有一个本地代理对象Proxy。
9.有什么实际解决UI卡顿优化的经历
答:UI卡顿的实际经历:
1).摄像头采集数,一秒50帧
在里面进行日志添加,string拼接导致的
2).加载大图的时候
在单纯使用BitmapRegionDecoder加载大图时
3).发现动画执行的时候会有点卡。
4).Layout Inflate
10.给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。
candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。 
对于给定的输入,保证和为 target 的唯一组合数少于 150 个。
答:
class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        List<Integer> combine = new ArrayList<Integer>();
        dfs(candidates, target, ans, combine, 0);
        return ans;
    }
    public void dfs(int[] candidates, int target, List<List<Integer>> ans, List<Integer> combine, int idx) {
        if (idx == candidates.length) {
            return;
        }
        if (target == 0) {
            ans.add(new ArrayList<Integer>(combine));
            return;
        }
        // 直接跳过
        dfs(candidates, target, ans, combine, idx + 1);
        // 选择当前数
        if (target - candidates[idx] >= 0) {
            combine.add(candidates[idx]);
            dfs(candidates, target - candidates[idx], ans, combine, idx);
            combine.remove(combine.size() - 1);
        }
    }
}
关于作者:
曾经入职的公司:
2013年 快播公司       因为涉黄被查了
2014年 华强集团       深圳北最大的电子公司
2015年 TCL公司        深圳传统电子公司
2016年 顺丰科技        深圳快递老大
2017年 招商银行        深圳本地银行老大
2018年 字节跳动        深圳后海,抖音头条
2019年 VIVO               深圳手机厂上梅林
2020年  腾讯音乐        深圳滨海大厦
2021年  蚂蚁金服        深圳分公司
从月薪3000到年薪60万。从专科生到深圳一线大厂。关注我就能达到大师级水平,这话我终于敢说了, 年薪60万不是梦!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值