文中附有详细的面试真题目,文末有我当时刷的面试真题还有一些对我帮助良多的复习资料,特别有用,希望也可以帮大家顺利上岸,顺便攒攒人品!
本人出生在一个普通家庭,自身学历很一般,并非985也并非211,就是一个差不多是三本的二本普通本科生应届毕业生。在读书期间有过一些简单的实习,也参与过一些小公司的项目,但我还是觉得自己在其它人的眼里还是很普通(所以,自己能够在今年特别不好找工作的期间被一家大厂公司给入取感到特别幸运!!!)。
思前想后,本来不想说的(被很多大厂给谢拒了),但我还是决定分享一下我的面试前面准备的过程。
在面试前,我刷了很多面经、面试题,这里也把自己的面经分享给大家,当做回报社区好了,顺便攒攒人品,希望往后可以一切顺利。
面试是通过远程视频会议的形式进行的一对多的线上面试。
首先是面试的基本流程
PS:会问很多基本知识,像是计算机网络、操作系统、编译原理这些底层什么的,大厂好像都挺喜欢深挖,建议大家多复习一下,钻一下底层。
不知道是不是Android部门的人比较忙还是由于他们部门人手不足,面我的面试官是一个从事 iOS 开发的,没问我太多 Android 专业相关的东西,几乎都是根据我的简历来问我的一些相关的问题。
1、ipv6 答不上来
2、http 状态码
3、http 请求
4、https 请求过程、网络安全
5、传送大图到服务器,进度功能实现
(这里扯了很多,一开始我理解成断点续传了,后面就是给的方案是 http 每次传一部分,根据状态码是否成功来处理,后面面试官觉得这个答案不行,让我从 TCP UDP Socket 这些角度去想,我说这些实现起来就更简单了,比如TCP就双向通信之类的。。)
6、gc
7、数据库索引,b tree b+ tree
8、设计模式
9、进程间通信,我说了几个,面试官说可以说 Android 的,好得!
10、rxjava,我说我之前封装过一个 rxbus,来实现消息总线,后面我是说了下消息总线对代码的影响还是比较大的,我到后面是尽量避免这样的操作。
11、算法: 字符串匹配,返回对应 index, 我用的 HashMap 实现。
总体感觉就是,面试官大多数都是问的网络,但网络不是我擅长的领域,有些别的想不起来了……
另外一个特点就是——深挖底层。不止是题目,面试官会深入一些小地方一直往下问(感觉他一直在让我感觉焦虑,我说一个,他就顺着往下又挖,一直挖到我完全回答不上来为止)……
这一面对我来说就些尴尬了……面试官有三个,个人感觉都不错,三个都是大佬,就是貌似他们那边的网络状态不是很好,还是我这边网络不好总是一卡一卡的。
1、Http1.1 和 Http 1.0 区别
2、keepalive 作用
3、keepalive 底层实现,这块我是不清楚的,我就猜测了下给了他一个答案。
4、操作系统怎么在堆上和栈上分配内存,我不太清楚,就说了 Java 虚拟机是咋分配的,结果问了我 Java 虚拟机是咋在操作系统上分配的,对不起我不知道!(后面强调了 c 的 api,我还是母鸡啊!)
5、操作系统进程和线程
6、虚拟内存
7、虚拟内存的缓存,我不清楚,依旧给了个猜测
8、手写单例,写了双重检索的,后面问我有别的吗,我说了静态内部类实现的,问我为啥静态内部类安全。
9、Android Framework,我问是 AMS 那些的吗,面试官说那太复杂了,你说下 handler , loop吧,然后问了一些相关的问题。(感动啊)
10、广播和本地广播的区别,实现原理
11、二面问我,一面评价说你觉得 rxjava 并不好,我赶紧说不是不行,rxbus 只是 rxjava 功能的一小部分,而是消息总线这样的方案有利有弊。后面说rxbus 具体封装 ,太久远了想不起来了,然后说了 rxjava 其他的用法和优点这一类的。
12、你用 map 写个 lru 吧,我说能用 LinkedHashMap 吗,不能, 后面我说了个思路,面试官觉得不行,然后说了 LruCache 怎么实现的, LinkedHashMap 怎么实现的,我说 LinkedHashMap 是用了 HashMap,在里面维护了一个双向链表,每次访问数据的时候修改链表。后面我就打算仿写一个 LinkedHashMap 来实现,多亏面试官即使打断,这个太费时间了,就不用写了。
13、手写生产者消费者,这里面试官一边看代码一边提问题,我跟着问题修改代码,其实就是把一个比较low 的生产者消费者优化成了面试官想要的样子(面试官在这里终于笑了)。
14、锁, synchronized 和 ReenTrantLock
15、抢占式锁和非抢占式锁,ReenTrantLock 怎么实现非抢占式
16、notify 和 sleep 区别
17、onTouch 和 onClick (这个我隐约中好像被问过
……剩下的记不清了
同样大致问题是这些,其他的也想不起来了,这块网络操作系统混合双打(还好没有再次一直挖网络)。
直接上面试题吧:
1、因为自我介绍时介绍了自己实习写的刷新加载的组件
2、 问我自己组件里怎么解决的嵌套滑动冲突,三个方面实现完美分发事件
3、 说 retrofit 动态这块
4、 retrofit 动态里面如果传的不是 interface 怎么办,这块我不清楚,我就直接说不太清楚,然后说了 retrofit 关于注解的处理
5、 注解生命周期,编译时注解解析
6、 你用过 weex,说下weex实现原理,我说我没有看过 weex 源码,但是我实现过一个动态页面渲染框架,说了下我的渲染过程和实现方案。
7、 最近想学的技术,说了音视频,但是因为准备春招放下了
8、 为什么想学,说了自己之前做一个 APP,里面播放器无法使用没认证的 Https 请求,打算自定义一个播放器,在底层处理证书这块,然后在说了下不知道这样的方案可不可行。
9、 使用 https 请求这个不难的, 我说因为我这个是自己签的,就没法认证。
10、 那你 okhttp 里面怎么认证的, 说了拦截器
11、 还有个 ConcurrentHashMap 同步方案, 然后问了 CAS
12、 环状链表
13、 TCP握手挥手
介于面试的时候比较紧张一二三面问题可能有个别搞混了,顺序也有些打乱,有些问题可能记不清了。当然,大家面试的时候也不会遇到完全一样的问题,这些只能当做准备面试前查漏补缺的一个参考吧。
最后,第三面的面试官依然棒,虽然问题节奏很快,但是不管是态度还是提问都很有技巧也很棒。
一星期后收到了offer,终于赶在毕业前上岸了。
其实我觉得自己属于很普通的类型,并没有很突出的地方,能够进字节有三分运气,还有七分还是靠自己的努力。
大家也不必妄自菲薄,首先要有自信,如果有想要去的大公司,一定要好好做准备,努力提升自己,让自己的能力和素质匹配得上目标公司。
我也一直相信天道酬勤,机会永远是留给有准备的人。在字节面试前我也准备了很久,刷了很多大厂面试题。
下面,我把自己面试前准备的知识点整理出来分享给大家【文中的面试真题解析和学习资料都在共享文件夹(点击此处可直达)】
Java基础
上面我列出来的这些都挺重要的,这些点在大佬整理的《Android面试题手册(中高级)》中都有收录,大家有需要的可以去看看。
Android基础
UI控件篇
网络通信篇
架构设计篇
这些点在PDF资料中也有收录,因为内容较多,是以文章链接的形式收录在《Android面试题手册(中高级)》中
代码改变世界,希望大家早日成为技术大牛。从现在开始,还不晚!
下面是我刷的一些其他的题目,一个是在大佬的公众号领的,一个是在网上找的,这份完整版的面试题PDF已经上传,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】