笔者是面霸,面试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.livedata原理 lifecycle livedata setvalue和postValue的区别 ,连续post两次和set两次有啥区别 ?粘性事件怎么事件?粘性与数据倒灌
2.多线程的情况下,类的加载为什么不会出现重复加载的情况?
3.ARouter的原理是什么?如果不用ARouter,你会怎么去解藕。接口?设计接口有什么需要注意的?
4. 自定义LinearLayout,怎么测量子View宽高
5.不建议用系统提供的线程池,为什么?
6.OkHttp里面怎么处理SSL?
7.Launcher启动App的流程,中间有几种跨进程通信
8.Glide的缓存,有用过Glide的什么深入的API,自定义model是在Glide的什么阶段
9.如何进行单元测试,如何保证App稳定 ?
10. 算法:给你一个整数数组
nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
备注:字节跳动一定会问生命周期
1.livedata原理 lifecycle livedata setvalue和postValue的区别 ,连续post两次和set两次有啥区别 ?粘性事件怎么产生和解决的?
答:因为一开始创建的observer会被包装成LifecycleBoundObserver,这里面的默认的Version是-1只有调用过onChange之后才会被赋值为最新Version,这个包装方法Google并没有提供给开发者,所以只能自己创建mVersion来管理
解决办法:反射干涉Version
2.多线程的情况下,类的加载为什么不会出现重复加载的情况?
答:1).双亲委托机制不会重复加载类
2.)多线程,和饿汉式单列一样。是因为JVM在类加载的过程,保证了不会初始化多个
static
对象。类的生命周期主要是:
看源码应该多个线程进行ClassLoading的时候加锁了。加锁方式大概时类似于使用同步容器的ConcurrentHashMap。
所有的类变量以及
static
静态代码块,都是在一个叫clinit()
的方法里面完成初始化。这一点,使用jclasslib
可以看出来:
clinit()方法是由虚拟机收集的,包含了static变量的赋值操作以及static代码块,所以我们代码中的static Singleton instance = new Singleton();就是在其中。虚拟机本身会保证clinit()代码在多线程并发的时候,只会有一个线程可以访问到,其他的线程都需要等待,并且等到执行的线程结束后才可以接着执行,但是它们不会再进入clinit()方法,所以是线程安全的。
3.ARouter的原理是什么?如果不用ARouter,你会怎么去解藕。接口?设计接口有什么需要注意的?
答:1)。编译通过apt生成java类
2)。初始化的时候映射关系,生成路由表
3)。跳转的时候,通过key,去hashmap中取找
接口+实现
4. 自定义LinearLayout,怎么测量子View宽高
答:如果是继承LinearLayout,不需要重写,已经有了,直接addview
如果是自己写LinearLayout,通过从上测量和从左测量,然后weight的化需要测量2次
5.不建议用系统提供的线程池,为什么?
答:5种类型
Executors各个方法的弊端:
1)newFixedThreadPool和newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
主要是里面是个没有边界的队列,导致有存储,就会导致oom
2)newCachedThreadPool和newScheduledThreadPool:
主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,
创建线程影响cpu,可以创建无限的线程数。
6.OkHttp里面怎么处理SSL?
答:SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。SSL 证书
代码在okhttpClient上面:通过x509Trustmanager。然后设置sslSocketFactory();
*/ public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory { static final List<Protocol> DEFAULT_PROTOCOLS = Util.immutableList( Protocol.HTTP_2, Protocol.HTTP_1_1); static final List<ConnectionSpec> DEFAULT_CONNECTION_SPECS = Util.immutableList( ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT)
boolean isTLS = false;
for (ConnectionSpec spec : connectionSpecs) {
isTLS = isTLS || spec.isTls();
}
if (builder.sslSocketFactory != null || !isTLS) {
this.sslSocketFactory = builder.sslSocketFactory;
this.certificateChainCleaner = builder.certificateChainCleaner;
} else {
X509TrustManager trustManager = Util.platformTrustManager();
this.sslSocketFactory = newSslSocketFactory(trustManager);
this.certificateChainCleaner = CertificateChainCleaner.get(trustManager);
}
if (sslSocketFactory != null) {
Platform.get().configureSslSocketFactory(sslSocketFactory);
}
7.Launcher启动App的流程,中间有几种跨进程通信
答:6种,用了binder机制和socket
8.Glide的缓存,有用过Glide的什么深入的API,自定义model是在Glide的什么阶段
答:磁盘和内存缓存
内存缓存:lrucache和弱引用
Glide的get()方法中,
应用场景:比如修改硬盘缓存的存储位置或者自定义硬盘缓存
Glide加载的所有图片都将会使用ARGB_8888的格式
class MyGlideModule : GlideModule { fun applyOptions(context: Context?, builder: GlideBuilder) { builder.setDiskCache(ExternalCacheDiskCacheFactory(context)) } fun registerComponents(context: Context?, glide: Glide?) {} }
9.如何进行单元测试,如何保证App稳定 ?
答:JUnit4,JUnit4是一套基于注解的单元测试框架
- @BeforeClass 测试类里所有用例运行之前,运行一次这个方法。方法必须是public static void
- @AfterClass 与BeforeClass对应
- @Before 在每个用测试例运行之前都运行一次。
- @After 与Before对应
- @Test 指定该方法为测试方法,方法必须是public void
- @RunWith 测试类名之前,用来确定这个类的测试运行器
10. 算法:给你一个整数数组
nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
答:class Solution {
public int maxProduct(int[] nums) {
int maxF = nums[0], minF = nums[0], ans = nums[0];
int length = nums.length;
for (int i = 1; i < length; ++i) {
int mx = maxF, mn = minF;
maxF = Math.max(mx * nums[i], Math.max(nums[i], mn * nums[i]));
minF = Math.min(mn * nums[i], Math.min(nums[i], mx * nums[i]));
ans = Math.max(maxF, ans);
}
return ans;
}
}
总结:都是设计,灵活性比较高的题目。没有那种死记的题目
关于作者:
曾经入职的公司:
2013年 快播公司 因为涉黄被查了
2014年 华强集团 深圳北最大的电子公司
2015年 TCL公司 深圳传统电子公司
2016年 顺丰科技 深圳快递老大
2017年 招商银行 深圳本地银行老大
2018年 字节跳动 深圳后海,抖音头条
2019年 VIVO 深圳手机厂上梅林
2020年 腾讯音乐 深圳滨海大厦
2021年 蚂蚁金服 深圳分公司
从月薪3000到年薪60万。从专科生到深圳一线大厂。关注我就能达到大师级水平,这话我终于敢说了, 年薪60万不是梦!