前言
从2020年11月开始面试准备到2020年最后一天31号晚上7点收到短信offer,历时两个月,在熬夜猝死边缘疯狂试探的我,终于等来我梦寐以求的“跨年礼物”。
“日尼玛,退钱”,《温暖的抱抱》电影前10分钟的开场剧情,让我不禁想着该如何说服朋友一起离场,却被自己短信铃声拉回了思绪,“应该调成静音的”。无聊的剧情本就让整个电影院变得十分寂静,赶紧把手机调成静音,翻阅短信一看抬头是“字节跳动”的短信offer。至此,电影剧情也开始笑点频出,“嗯,是一部不错的爆米花喜剧电影”电影结束后和朋友议论道。
对于这部电影的看法,仅是个人观点,不喜勿喷。闲话好像说的有点多了,不过希望朋友们理解下我想跟大家分享这份喜悦的心情。回归正题,面经分享!希望对大家有借鉴意义和帮助。2个月的时间总共是面试了9家,(2小,4中,3大厂),小的都拿下了(压根儿没想去,主要是面试练练手,检验下自己的水平),4中里3个一轮游,1个三轮游,3个大厂最后拿到了字节的offer,阿里的一面就挂了,腾讯的到了三面。
大小厂的面试要点简要
- 小公司会比较偏重于业务,面试上也偏重业务(但也少不了算法题,字节就每轮必问),比如做了什么,大概方案,用了哪些库,库的原理。这些基本上会集中在图片处理,网络封装,自定义view这几个部分。
- 大厂会从业务入手,递进深入到原理及相关知识点,尤其集中在原理部分,这里对平时源码阅读有一定要求。或者直接问对xxx源码有没有了解。比如一个handler机制,因其涉及的地方特别多而且很容易展开,想完美答好,真的不是一次两次就能行的。
建议每次面试完,都及时对面试内容进行回忆记录,当前这里不是为了泄题漏题,以后吹牛逼,这个没有任何意义。目的是进行复盘,打磨自己的回答。这也是我为什么在面试大厂之前会先去小、中场先去试水以及写下这篇面经分享的原因。其实在前半个月我就已经面完了6个小、中场,也正是在中厂这环节的挫败,让我余下的一个多月都在做复盘、查漏补缺,为面试大厂做准备。
简历书写
强烈建议,把自己的强项,亮点加粗注明放在简历前面,大家都很忙,也很烦躁,让人一眼就看到优点,对双方都友好。因为我对Android性能优化方面感兴趣,平时工作也花了很多时间在这里,所以我会在简历上突出说明,我做了内存优化,熟练掌握使用xxx,内存性能提升xxx(因为这里的内容是可控的,如果面试官对你感兴趣,这里的回答你也是能提早准备好的)。
项目经历如何写?建议按照是什么,做了啥,有啥数据指标佐证的方式去写。比如,我做了xx项目,负责xx模块,使用了xxx框架,可配合xx做xxx,效率提高xxx%这样子。
以上仅为自己的个人经验,仅供参考,接下来给大家分享下我的字节三面技术面和腾讯三面的面试题分享(阿里一面就挂了,就不献丑了)。
字节一面
1.先聊简历。
2.聊性能优化方面的问题,我这边体系化展开讲卡顿,瘦身,内存,crash等方面的优化经验。
3.sychronized,volatile区别?
(这里可以体系化的回答,主要从JMM角度去回答,最后深入到字节码层面的区别。因为提到了修饰的范围有差别,就有了下一题。)
4.对于锁的对象的不同,效果会有什么差别。
5.讲一下Handler机制。
(这个问题问得太多了,一定要去看一回源码。重点答的是MessageQueue这块,包括什么时候空闲,阻塞。发散讲了线程相关的ThreadLocal,还有IdleHandler)
6.出了一个设计题,当你的服务商出现问题,设计一个网络请求可用性的兜底方案。
(大概从HttpDNS,域名容灾等方面回答吧。)
7.设计一个方案,apk已经发出去了,java代码是最新,但是分包下发的so文件是旧版本,如何做一个兼容方案,保证兼容可用。
(这里没答好,我也忘了怎么答的了。)
8.Java类加载机制。
(这是个基础概念题,没答好,回答的双亲加载机制。
然后引出PathClassLoader,DexClassLoader的区别,一个dex的加载到一个java类的加载过程。)
9.一道算法题。
字节二面
1.聊简历。
2.性能优化,展开讲了卡顿,内存。
3.数据结构的题,hashCode的扰动算法,涉及到一个数字,31,这个31是怎么来的?
4.类的static属性字段,比如 public static int a = 1,被赋值几次?
(这个需要对类的加载机制有了解。)
5.多个Activity共同bind一个service,一个Activity destory,问service的情况。
(这里就是问service的生命周期,考察bind跟start的区别。)
6.装饰器模式,跟代理模式的区别。
(考察对常用的设计模式)
7.okhttp的缓存逻辑实现。
(我以为是问的 链接缓存跟io缓存,我回答的是连接池复用跟 okio的io复用。后来提醒是cache,就回答CacheInterceptor,及其源码实现。)
8.SharedPreference的commit ,apply区别。
9.SharedPreference的其性能问题。
(apply的anr是有一个字段,会block住主线程,需要清理queuedWork队列。)
10.SharedPreference线程安全性,还有是否进程安全,SharedPreference锁的对象是谁?
11.synchornized锁对象,汇编实现。volatile的汇编实现。
12.volatile 修饰 boolean能保证原子性么?
13.Android有哪几种动画。
14.设计题,设计一个埋点数据上报库,需要哪几个模块,提供哪样的接口。
15.算法题,生产消费者模型。
16.ConcurrentHashMap的相关。
(包括实现原理,put方法,树化,扩容,继承了谁,扩容的时候,其余桶怎么感知。)
17.安卓打包签名v1,v2,v3的区别。
字节三面
1.装饰器模式,适配器模式区别。举个Android或java里的应用例子。
2.单例的优缺点。
3.架构有做过么。
4.说一下项目,项目中最能体现你能力的事情。
5.平时怎么学习的。
6.以后的职业规划
7.离职原因
8.插件化,做过插件化么,了解的主流方案?
9.算法题。
腾讯一面
1.mmap + native 日志优化?
2.广播和 EventBus 的区别?
3.常用设计模式你了解哪些?
4.跨进程通信有哪些?
5.简单讲讲 binder 驱动吧?
6.跨进程传递大内存数据如何做?
7.说说 ConcurrentHashMap 的实现原理说下,初始化大小是多少?
8.启动优化怎么优化?
9.你写的 rxpay 和 rxlogin 具体怎么实现的?
10.kotlin + fullter 方面的
腾讯二面
1.单例设计模式都写写,静态内部类是怎么保证线程安全的?
2.synchronized 底层实现原理,ReentrantLock 公平锁与非公平锁。
3.主线程等待所有线程执行完毕,再执行某个特定任务怎么实现?原理和源码看过没?
4.自定义 view 的一般流程,要注意些什么如何优化,点击事件和长按时间分别是怎么实现的?
5.四种启动模式,在源码分析中的原理是怎样的?
6.讲讲 bindService 的过程,你当初是怎么优化后台服务进程的?
7.开发中你都用到了哪些设计模式?说说当时具体的场景。为什么你要用方法工厂,另外两种呢?
8.RxJava 在使用过程中碰到了某些不友好的错误一般怎么解决?发现了内存泄露一般怎么解决分析,有没有9.碰到过系统服务内存泄露的问题?
10.你们用的 okhttp ?那你有没有做过一些网络优化呢?比如弱网环境。
11.给你个数 1 吧,比如 1000011 里面有几个 1 ?
12.快排了解不?最坏的情况是怎样?如果有大量重复数据怎么优化?
腾讯三面
1.讲讲 handler 的底层实现原理?
2.说说你做的日志记录优化?
3.你看过 binder 驱动的源码,说说他的内存映射过程,说说客户端等待服务端处理返回的流程,如果要跨进程传递大内存数据你具体会怎么做?简单写一写吧。
4.在公司做过哪些优化?
5.开发过程中遇到的一些最难解决的问题?
6.提到了动态修复替换加载 so ,那你知道怎么修复 class 吗?怎么修复资源呢?
7.还有什么要问我的?
标签:怎么,字节,喜提,offer,安卓岗,面试,源码,内存,优化 From: https://blog.51cto.com/u_16163480/6534865