笔者是面霸,面试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平时开发过程中用的还真是少,网上找的一个解释:
8.MMKV实现原理,和SP有什么不同的地方
答:他们两个都是用来持久化key-value形式的数据,
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采用最近最少使用算法,即当缓存到达设置的大小时,将会移除最近最少用的数据。
10、JVM内存模型,Android中使用的是哪一种垃圾识别算法
感觉这里面试官混淆了两个概念:JVM内存结构和JAVA内存模型。JVM内存结构就简单的了解了一些,但是现实工作中,我真不知道怎么使用(因为没有处理过这些东西,其实存在即有意义,是自己太孤陋寡闻了)
关于作者:
2013年 快播公司 当时播放器老大,你懂的
2014年 华强集团 深圳北最大的电子公司
2015年 TCL公司 深圳传统电子公司
2016年 顺丰科技 深圳快递老大
2017年 招商银行 深圳本地银行老大
2018年 字节跳动 深圳后海,抖音头条
2019年 VIVO 深圳手机厂上梅林
2020年 腾讯音乐 深圳滨海大厦
2021年 蚂蚁金服 深圳分公司
从月薪2000到年薪100万。从专科生到深圳一线大厂。关注我就能达到大师级水平,这话我终于敢说了, 年薪100万不是梦!