想要获取笔者自己整理的Android、Java面试资料原文文稿(markdown格式),可关注左边栏二维码所示公众号,公众号内回复"A3"(Android资料)、“J4”(Java资料)即可自动获取。
笔者2.17号接到面试邀约,3.4号第一波抖音面试,四次技术面后被拒,心有不甘又找人又进行了二次内推(主要是第一次被拒的有点不明不白),从第二次内推到HR面试给口头Offer大概一周,本文主要记录从开始面试到最后面试完成的一些经历和经验,主要是Android岗,其他岗位虽然涉及的具体技术点不同,但是基本流程和面试官主要考察的基础内容应该是一样的,希望可以帮助到各位还在找工作的小伙伴们。
面试TimeLine&面试主要题目
-
2019.2.17 17:00 投出简历,字节跳动,base北京
-
2019.2.17 19:21 (抖音)接到HR面试邀约,约定3.4日远程面试
-
2019.2.18 开始准备面试(Android岗)
-
2019.3.4 14:00-15:00 (抖音)第一轮技术面试
由于准备时间短,再加上没有过大公司的面试经历,所以第一次面试慌得一批,面试前五六分钟心跳加速面红耳赤,还好面试开始之后面试官人不错状态有好点。一面主要是基础技术面,主要涉及到:进程&线程的区别,线程池的用法、原理,TCP三次握手、四次挥手、HTTP请求报文格式,算法是二叉树中序遍历,偏基础。
-
2019.3.4 15:20-16:30 (抖音)第二轮技术面试(交叉面)
一面完了之后本来打算换衣服去打球,结果刚换一般面试官打电话让我回面试间面试,太尴尬了,二面是交叉面,是火山小视频的工程师面的,主要涉及TCP基础、Activity启动模式、OKHttp源码讲解、java修饰符、java线程同步的方法、synchronized对不同方法加锁的区别、java中的引用、kotlin和java的区别,算法题是平衡二叉树的判断。
-
2019.3.8 15:30-16:30 (抖音)第三轮技术面试(Leader面)
真正翻车就在三面,也许是前两面太顺利,导致我有点放松警惕了,结果三面被虐的体无完肤,三面面试官一看就是个技术大佬,问的问题都很基础但是让你很难回答好,主要涉及: 数据库索引、事物等的概念、sql语句的结构、java中类似c 中的析构函数、java和c 的异同点、java和c 各自传参数的方式、Android中除了线程池还有哪些多线程的实现方式、AsyncTask详问、http协议介绍、最后算法做了一道DFS的题,翻车。
ps:关于AsyncTask笔者结合自己阅读源码的经历整理了一篇文章:https://blog.csdn.net/qq_36982160/article/details/88997691 ,希望可以帮到大家。
-
2019.3.11 14:00-15:00 (抖音)第四轮技术面试(应该是加面)
三面完了之后本来以为必凉,结果过了半个小时HR打电话通知下一轮技术面试,猜想应该是前两面面的不错,三面有点差,那边想加面一次再确定一下。四面是个又年轻又帅的小哥,但是问的问题让我很难受,比如为什么把代码放在github上????我解释了半天说是为了备份,为了之后复盘什么的,不过他好像并不care我的解释…然后是给定一个View,如何拿到他的所有子孙view的数量,view和viewgroup的区别、Activity启动模式、hashmap原理、事件分发机制、java中所有类的基类是什么,其实现了哪些方法,算法题是从arg数组中找出前n大的元素
四面面的一般,不过由于面试官全程没有表达我是对是错,所以给我一种以为自己都答对了的假象,结果后来一回想还是答错了很多东西,然后就是好几天没结果,打电话问了HR几次,都是让等,估计是备胎了,再等了几天就收到拒绝邮件了。
-
2019.3.15 11:48 (抖音)收到拒绝邮件,确定被刷
-
2019.3.17 17:21 (今日头条)第二次收到HR邀约面试,字节跳动,base北京
第一次面试失败了之后总结了一下,主要是基础知识没复习到,再就是没有面试经验,所以不太甘心,又找人内推了字节跳动的简历,很快收到了面试邀约。
-
2019.3.19 15:00-16:00 (今日头条)第一轮技术面试
一面还是基础面试,主要涉及懒加载的单例模式实现、Synchronized介绍、Handler原理、线程池介绍、Service介绍、已定义View、listview如何优化,算法是求给定数组中连续数字的最大和。
-
2019.3.20 15:00-16:00 (今日头条)第二轮技术面试(交叉面)
二面交叉面,主要是java和android,开局先写一个生产者消费者模式的实现,然后问了设计模式中的代码设计原则、其他一些常见设计模式的介绍、屏幕适配方案、线程池、进程、Activity启动模式、其他四大组件介绍、接口和抽象类的区别,算法先让找链表倒数第a个节点,直接秒过,然后面试官估计觉得算法部分太没体验感,又让写了一个二叉树深度,又秒过,面试官看了看我说再见,甚至都没让我问问题,吓我一跳还以为写错了…
-
2019.3.20 16:30-17:30 (今日头条)第三轮技术面试(Leader面)
Leader面不会涉及太多技术,主要比较偏重算法和基础,看你思考问题的方式,看你值不值得培养,这一面具体问题记不清了,只记得问了List中元素的删除,主要是注意考虑ConcurrentModificationException,还有介绍了一下Fragment,然后是给定一个有重复元素且有序的数组,找出target的下标,用了二分查找,算法虽然没问题,但是边界什么没考虑好,被面试官教育了一波,说写代码要重点关注异常点。
ps:关于Fragment笔者总结了一篇文章: https://blog.csdn.net/qq_36982160/article/details/88998595
-
2019.3.22 16:00 -16:20 (今日头条)HR面,谈薪资,给口头Offer
三面完之后自我感觉不错,应该没太大问题,然后接到HR电话,大概聊了聊入职时间、部门工作、薪资什么的,然后说Offer在审批中,过几天批下来第一时间通知。
-
2018.3.28 17:52 正式收到今日头条Offer
面试重点&需要掌握的东西
一个月期间不仅面试了字节跳动,还参加了阿里、腾讯的几次面试,但是阿里腾讯流程太慢,每面一次常规操作就要等一周才可能有下一次面试,所以到现在都没结果,互联网公司虽然业务不同,但是面试重点基本都是一样的,Android(实习)岗主要涉及:
- Java
- Android
- 算法
- 项目经历
- 数据库
- 网络
关于这一部分,可参见 https://github.com/DmrfCoder/interview ,是我个人面试过程整理的文档,附加我参加腾讯、阿里面试的一些问题。
面试感想&建议
写好简历
简历一定要简洁,写上自己的项目经历、实习经历、技术栈等就好,不要写诸如血型身高是否是党员之类有的没的,没人关心那些,还有就是写上一些主要的获奖经历,这主要指的是技术类的比赛,至于奖学金之类的可有可无,再有就是尽量简历发的时候转成pdf,别发word,最好用latex写,不仅排版简洁,而且美观。
重视算法
很多人觉得只要自己技术过硬就好了,真实情况是大厂会比较看重你的算法基础,看你是否值得培养,算法这块建议起码把剑指Offer刷一遍,确保每个题都能秒过,注意算法不需要刻意追求数量,但是一定要刷一道会一道,再遇到同类型的题可以秒过。这里推荐我个人刷题的一些总结:https://github.com/DmrfCoder/AlgorithmAndDataStructure
重视基础
现在技术迭代更新太快,很多同学为了做项目只会无脑调用各种API,知其然不知其所然,这在面试的时候会吃大亏,建议多看一些重要的源码,基本上每个面试官都会让你介绍自己看过的源码,Android这块,常用的开源框架,比如okhttp等,挑一两个深入源码看看,还有AsyncTask,最好也看看源码。
附录(2019年春招腾讯&阿里Android实习部分面试真题)
腾讯(微信)
OkHttp源码讲解,OkHttp中连接池的最大数量,连接池的实现原理
有两个View:view1和view2,view2在view1上面且比view1小,如何判断点击view1之内的屏幕是应该由view1处理事件还是由view2处理
NDK是否可以加载任意目录下的so文件,so文件有几种加载方式
自定义view的方法,为什么在ondraw中绘制即可产生相应效果,什么时候使用自定义view什么时候使用原生view
ndk加载so时如何考虑32位和64位的不同,如何考虑不同的arm平台
sqlite是不是线程同步的
有没有对比过flutter和其他跨平台方案有什么异同点
腾讯(腾讯视频)
错误码和错误描述,可能多个离散错误码对应一个错误描述,如何根据不同的错误码返回不同的错误描述?
NDK中c持有java的对象和java持有c的对象如何管理内存?全局引用、局部引用?
腾讯(腾讯音视频实验室)
apk如何缩减包的体积?有没有了解过webp?
java编译后和c 编译后有什么区别?
String的不可变性是怎么实现的?
自定义view的流程?
如何实现一个icon下半圆蒙层的效果?(path路径的概念)
在Athread中调用bThread.sleep,休眠的是哪个线程?
java类中有的变量没有被用过,是否可以随意删除?为什么?(有可能被反射用到了)
屏幕上有view1 view2 view3,其显示流程是怎么样的?
String[]的父类是否是object?
ndk中的局部变量如果不手动释放一定是安全的吗?
链表的翻转
20亿个qq号码,判断其中是否存在target 号码
ndk中extern c有什么作用
ndk中attachCurrentThread是干什么的?
invalidate()和postInvalidate() 以及requestLayout()的区别
蚂蚁金服-支付宝
神经网络模型如何减小体积
Android中如何自己实现跨线程的通信
Android中的synchronized和reentrantLock有什么区别
如何反转一个链表,时间复杂度是多少
快排的思想,最好、最坏时间复杂度
Android中一个线程是否可以持有多个handler、messagequeue、looper?
handler机制
AsyncTask原理
数据库如何短时间高效批量插入数据
java静态方法是否可以被重写
非静态内部类和静态内部类的区别
使用fragment有什么好处?
有没有使用过fragment的嵌套?
handler.postDelayed中的run是工作在主线程还是子线程
android中是如何做内存管理的,android中什么情况下会导致你内存泄漏
arraylist和LinkedList的区别,各自的使用场景
java gc机制的介绍