2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 2.牛批了 Android 中高级面试题 一线大厂和二线大厂面试真题精选 (京东 附

2.牛批了 Android 中高级面试题 一线大厂和二线大厂面试真题精选 (京东 附

时间:2021-01-31 14:21:02

相关推荐

2.牛批了 Android 中高级面试题 一线大厂和二线大厂面试真题精选 (京东 附

笔者是面霸,面试500+场 当过考官:面过别人500+场 去过500强,也呆过初创公司。

斩获腾讯、美团,字节跳动,蚂蚁金服,华为、OPPO,offer!我有一套速通大厂技巧分享给你!

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

本系列一共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+, 难易程度:难 看完你能进这些公司:

腾讯,支付宝,字节跳动,快手,华为,滴滴,美团,百度 包含以上所有企业

强调:一定要搞的非常清晰,细节一个都不能放过,要非常深入,仅仅10题而已

TCL面试真题第一套,难易程度:简单

1.组件化有用过么?组件之间的通信怎么实现的?

2.Kotlin 变量、构造函数、init方法

3.屏幕适配方案

4.自定义View你做过哪些东西?

5.Handler如何保证线程安全的

6.Retrofit用到设计模式?动态代理你了解多少

7.AIDL的in和out的了解么

8.MMKV实现原理,和SP有什么不同的地方

9.Glide.with传入的application和activity、fragment有什么区别 ? Glide的缓存有了解吗?LRUCache算法的了解?

10.JVM内存模型,Android中使用的是哪一种垃圾识别算法

一个一个问题来总结一下:答案由蚂蚁金服首席架构师提供

1、组件化有用过么?组件之间的通信怎么实现的?

答:对于这块并不是很熟,目前使用的就是自己在github上开源了一个快速开发框架,是用Kotlin+Jetpack(LifeCycle、LiveData、ViewModel、Databinding)+Arouter+Retrofit+Glide+协程来抽取封装的一套快速开发框架,项目地址:Kotlin+Jetpack+Databinding+协程+Retrofit+Glide+MMKV封装的MVVM快速开发框架,这里面其实Arouter、Databinding都是看着文档来使用的,对里面的原理还没了解过。这个会抽时间再去了解了解的。

2.Kotlin 变量、伴生对象、构造函数、init方法的初始化顺序?

答:先进行变量的初始化,伴生对象、之后进行init方法块,而后进行构造函数。kotlin在编译后的Java代码中,伴生对象类似与静态变量、方法,所以优先执行,init方法块的代码会比构造函数中的代码块先行调用。

3. 屏幕适配方案

答:目前市场上最常见的应该是两种,一种是最小宽度限定符方案(SW),一种是今日头条适配方案。比较早以前我用的是限定符方案,有一个开源的jar包,可以生成一堆dimens.xml文件,在适配时,系统会精准定位使用某一个dimens.xml文件,如果定位不到则是向上还是向下选择一个来匹配,具体向上还是向下忘记了,反正就是就近原则。现在我用的是今日头条适配方案,主要是动态计算density的值,比如一个540dp的设计稿,在1080px手机上时,算出来的density值为 1080/540 = 2,在540px手机上时,算出来的density值为:540/540 = 1,假如一个View的宽度为50dp,那在1080px手机上所占用的像素就为502 = 100px,在540px手机上所占像素为501 = 50px,则它们的 百分比值是相等的 100/1080 = 50/540。

4、自定义View你做过哪些东西?

答:自定义View,我做过最多的就是几种控件的组合,就好比顶部Toolbar的一些自定义。这样做可以减少一些xml的层级嵌套,减少加载xml过程中的Xml2View的过程,加快一些渲染速度。其他一些比较炫酷的自定义View基本就是github找一些现有的来进行修改。主要就是对自定义View中的测量、布局、绘制这三个方法以及事件的分发等做一些修改。看看自定义View相关,事件分发相关。

5、Handler如何保证线程安全的?

答:在Handler发送消息时,会将Message存入MessageQueue消息队列中,即enqueueMessage方法,这个方法中,有一个synchronized(this){}的方法块,同时在Looper.loop()方法中的MessageQueue.next()方法中也是使用synchronized加锁的方式来保证存取Message的线程安全的。

6.Retrofit用到的设计模式

答:在初始化的时候用了建造者模式,通过不同的调用顺序以及传入不同的参数来实现不同功能的Retrofit,比如传入的CallAdapterFactory可以自定义实现等等( 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示),在创建CallAdapter/Converter的时候用到工厂模式(用于创建对象的接口,让子类决定实例化哪个类),还有适配器模式:CallAdapter用来适配OkHttpCall对象,在调用CallAdapter.adapt方法时,OkHttpCall实例会作为参数传递给adapt方法交给CallAdapter去适配(将一个类的接口变成客户端所需要的另一个接口,从而使原本因接口不匹配而无法一起工作的两个类可以在一起工作),当然,Retrofit.create方法应该是Retrofit最为重要的方法,用了动态代理来获取一个接口的代理对象,之后通过代理对象去调用接口中的方法获取Call对象,发起请求。

动态代理你了解多少?

答:动态代理是在运行时才会生成代理类,通过ClassLoader进行加载,动态代理需要实现InvocationHandler接口,实现invoke方法。Retrofit中的create方法通过Proxy.newProxyInstance方法实现动态代理,在invoke方法中通过ServiceMethod对接口方法及注解的解析,返回一个接口的代理对象。

7.AIDL的in和out的了解么

AIDL平时开发过程中用的还真是少,网上找的一个解释:

in、out、inout表示跨进程通信中数据的流向(基本数据类型默认是in,非基本数据类型可以使用其它数据流向out、inout)。in 表示数据只能由客户端流向服务端。(表现为服务端修改此参数,不会影响客户端的对象)out 表示数据只能由服务端流向客户端。(表现为服务端收到的参数是空对象,并且服务端修改对象后客户端会同步变动)inout 则表示数据可在服务端与客户端之间双向流通。(表现为服务端能接收到客户端传来的完整对象,并且服务端修改对象后客户端会同步变动)

详细解释可以看看:AIDL参数中in、out、inout的区别

8.MMKV实现原理,和SP有什么不同的地方

答:他们两个都是用来持久化key-value形式的数据,

SP是Android提供的,MMKV是腾讯开源的一个框架。SP保存的格式为XML,在初始化SP的时候是使用IO的方式读取(用户空间拷贝到内核空间,内核空间拷贝到磁盘,即两次数据拷贝)整个XML文件进行解析,存入内存Map集合中(ArrayMap),在每一次修改的时候的时候,都是将Map转化为XML文件进行文件的覆盖操作(全量更新)。MMKV其实就是利用mmap内存映射的来实现的,通过NDK的方式,调用了Linux的mmap方法以及memcpy方法实现的,就是一次内存映射和一次数据拷贝 ,MMKV保存的数据格式是连续的一个字节数组,数据总长度-》key长度-key-value长度-value的形式。mmap:在用户空间开辟一块内存,和文件建立起一个一对一的映射关系(内存映射),只需要做一次数据拷贝,所以操作内存就是操作文件,不需要再开线程进行IO操作。相比较来说,MMKV存储的数据量较小、存储效率较高、支持多进程数据同步等。

9.Glide.with传入的application和activity、fragment有什么区别

答:Glide.with传入application时,会调用getApplicationManager方法,方法中通过双重校验锁的单例模式方式获取一个RequestManager,使用ApplicationLifecycle来管理生命周期。传入的activity、fragment等其他非application的Context时,会判断当前是否是主线程,如果不是主线程的话,则会调用getApplicationManager,如果是主线程的话,会使用一个空白Fragment来管理生命周期。也就是说传入的是application和activity、fragment最大的区别应该是Glide的生命周期不同,application是整个应用程序的生命周期。

Glide的缓存有了解吗?

答:Glide缓存应该说是有两种吧,内存缓存和磁盘缓存,内存缓存又分为活动缓存和非活动缓存。活动缓存(activeResources)中使用弱引用的HashMap来存储,非活动缓存为:LruResourceCache,其实就是利用LruCache算法来缓存的。Glide中,先从活动缓存中获取缓存,如果没有则从非活动缓存中获取,然后从非活动缓存中取出,放入到活动缓存,不可见后重新放回到非活动缓存。而Glide的磁盘缓存通过DiskLruCache来实现。不管是内存缓存还是磁盘缓存,缓存的key都是通过对URL进行一系列的变化得到的,所以有时候我们经常会见到存储在七牛云等一些服务器上的图片会有缓存失效的问题,其原因是因为那些图片后面会加一个token的问题,所以如果出现这种问题,我们就需要通过重写GlideUrl类中的getCacheKey方法,在这个方法里去除多余的token部分。然后通过load(new MyGlideUrl(url))的方式去进行加载。

LRUCache算法的了解?

答:LRUCache采用最近最少使用算法,即当缓存到达设置的大小时,将会移除最近最少用的数据。

LruCahce基于LinkHashMap双向链表实现,在 HashMap的基础上,新增了双向链表结构,每次访问数据的时候,会更新被访问的数据的链表指针,具体就是先在链表中删除该节点,然后添加到链表头header之前,这样就保证了链表头header节点之前的数据都是最近访问的(从链表中删除并不是真的删除数据,只是移动链表指针,数据本身在map中的位置是不变的)。LruCache 内部用LinkHashMap存取数据,在双向链表保证数据新旧顺序的前提下,设置一个最大内存,往里面put数据的时候,当数据达到最大内存的时候,将最老的数据移除掉,保证内存不超过设定的最大值。

10、JVM内存模型,Android中使用的是哪一种垃圾识别算法

感觉这里面试官混淆了两个概念:JVM内存结构和JAVA内存模型。JVM内存结构就简单的了解了一些,但是现实工作中,我真不知道怎么使用(因为没有处理过这些东西,其实存在即有意义,是自己太孤陋寡闻了)

JVM内存结构分为五大类:程序计数器、JAVA虚拟机栈、本地方法栈、方法区、堆。前三个随线程而生,随线程而死,方法区和堆是JVM在gc时主要关注的两个地方。JVM垃圾识别算法主要有两种:引用计数法、可达性分析法

1、引用计数法:一个对象被引用一次,引用计数+1,断开引用,引用计数 -1,当引用计数为0的时候就可以认为是垃圾。无法解决相互引用的问题,如A引用B,B引用A,两个引用计数都不为0

2、可达性分析法:GC ROOT的对象作为搜索起点,通过引用向下搜索,所走过的路径称为引用链。通过对象是否有到达引用链的路径来判断对象是否可以被回收。可以作为GC ROOT的对象有: 1、JAVA虚拟机栈中引用的对象 2、方法区中类静态属性引用的对象 3、方法区中常量引用的对象 4、本地方法栈中JNI引用的对象垃圾回收算法主要有四种:标记清除算法、复制算法、标记整理算法、分代收集算法

1、标记清除算法:标记清除算法有两个过程,一:标记的过程、二:清除的过程。标记清除的过程会产生内存碎片(不连续),如果有一个对象需要申请大量连续内存时,就可能无法找到可以用的内存块,不得不触发新的一轮垃圾回收操作。

2、标记整理算法:和标记清除算法的区别是在清除之前会将要清除的内存进行重新整理成一块连续内存块,之后再进行清除,优点是清除后的内存是连续的,但是重新整理时间成本将提高

3、复制算法:是将一块内存分成两份,一份是空的,一个用于存储对象。当发生GC的时候,将一个上面存活的存入空的那份里面,然后将非空的清除,循环往复。优点是不会出现内存碎片化问题,缺点可以用内存对半区分了。

4、分代收集算法是将内存分为新生代、老年代,新生代占用1/3,老年代占用2/3。新生代中主要使用复制算法,新生代回收是比较频繁的,复制算法较优。老年代采用标记整理算法。

关于作者:

快播公司 当时播放器老大,你懂的

华强集团 深圳北最大的电子公司

TCL公司 深圳传统电子公司

顺丰科技 深圳快递老大

招商银行 深圳本地银行老大

字节跳动 深圳后海,抖音头条

VIVO 深圳手机厂上梅林

腾讯音乐 深圳滨海大厦

蚂蚁金服 深圳分公司

从月薪2000到年薪100万。从专科生到深圳一线大厂。关注我就能达到大师级水平,这话我终于敢说了, 年薪100万不是梦!

2.牛批了 Android 中高级面试题 一线大厂和二线大厂面试真题精选 (京东 附答案)第二套 22k+

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。