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

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

12年毕业,专科生,做安卓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。新生代中主要使用复制算法,新生代回收是比较频繁的,复制算法较优。老年代采用标记整理算法。

关于作者:

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

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

2015年      TCL公司        深圳传统电子公司

2016年       顺丰科技        深圳快递老大

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

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

2019年      VIVO               深圳手机厂上梅林

2020年      腾讯音乐        深圳滨海大厦

2021年      蚂蚁金服        深圳分公司

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

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

  1. 6.牛批了 Android 2021中高级面试题 一线大厂和二线大厂面试真题精选 (小米 附答案)第三套 28k+

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

  2. 七面阿里!分享一下我的2021阿里春招回忆录+详细的简历介绍+面试真题分享(附答案)!

    简历上写的东西: 投递岗位:Java开发实习生 教育背景:双非本 软件 + 985硕 计算机 实习背景:从2020/8-至今,一直在华为杭研所鲲鹏计算产品部实习 项目背景: (实习项目)鲲鹏Java性 ...

  3. 8.牛批了 Android 2022高级 资深面试题 一线大厂和二线大厂面试真题精选 (腾讯 附答案)第八套 35k+

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

  4. 9.牛批了 Android 2022高级 资深面试题 一线大厂和二线大厂面试真题精选 (字节跳动 附答案)第九套 38k+

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

  5. 10.牛批了 Android 2022高级 资深面试题 一线大厂和二线大厂面试真题精选 (蚂蚁金服 附答案)第十套 40k+

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

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

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

  7. kotlin发音!这份字节跳动历年校招Android面试真题解析,附架构师必备技术详解

    前言 从2010年开始Android市场开始需要大量的Android开发人员,招聘市场上也开始大量招Android开发人员,大量java开发者开始学习Android开发,招聘市场面试要求上只要有一定j ...

  8. Android面试专题 | 大厂安卓开发高频面试真题174问(附详细答案)

    每年求职季就是修罗场,无数人削尖了脑袋想进大厂,我身边当然不乏和我一样心怀大厂梦的人,但大家也都清楚进入大厂的难度有多高. 在入职谷歌之前我也曾经历无数坎坷,陷入过技术瓶颈和人生低谷,面试前艰苦的复习 ...

  9. 华为Android面试真题解析,附赠课程+题库

    背景 经常有网友在知乎问答提两个问题:"现在学习移动开发还有前景吗?""开发还有什么可以研究的?".网友回复:"现在还学移动开发?如同49年加入国军! ...

最新文章

  1. risc-v 操作系统教程
  2. SAP标准OK Code Values 列表
  3. Python是非常优美的语言,那到底如何个美呢?
  4. Java网络爬虫该如何学习
  5. Node.js「二」—— fs 模块 / async 与 await
  6. html5中web存储(localStorage、sessionStorage)与cookie的区别?????
  7. [文摘20080908]哈佛大学成功25句
  8. SHEL脚本中调用另外一个脚本的函数和变量
  9. 关于“wuauclt.exe”病毒的清理
  10. 网站友情链接交换的方法
  11. python取值范围_python 数据库取值范围
  12. 如何解决移动硬盘无法格式化?两招方法教会你
  13. html中用form单选框右侧提示汗字,HTML表单(Forms)解析
  14. 托疫情的“福”,和儿子一起过了个暑假
  15. 帐篷混沌映射在优化算法中的应用
  16. GhostXP SP3 统一会员纯净版 V2.1
  17. Asterisk模块编写指南
  18. 时间戳与日期相互转换
  19. CentOS7系统下Java环境和tomcat的安装
  20. 塞班s60v3手电筒sisx_s60第三版_塞班v3软件下载网站_塞班s60 v3论坛

热门文章

  1. python安装hyperlpr
  2. Dell Inspiron 5520 笔记本盲刷BIOS
  3. 【canvas使用】
  4. 软件工程导论08-基于构件的软件开发
  5. 如何解决“Component ‘MSCOMCTLOCX‘ or one of its dependencies .....“
  6. 男人不愿被打扰的五个时刻
  7. 修复 Android 系统问题的 9 款最佳 Android 手机维修软件和应用
  8. 图片如何高清修复?高清修复图片的方法
  9. opencv项目实践一(答题卡识别)
  10. Simulink系列 —— S-function的使用笔记(1)