2020届研究生,Android开发岗。
准备了四个月终于拿到了大厂的几个offer,一共面了字节跳动、腾讯、美团、快手、百度、阿里钉钉部门,offer都拿到了,最后决定了去美团~
字节今日头条
字节面试比较注重基础,包括在线写题,数据结构,Java基础,JVM基础,操作系统等;以下包括实习3面;字节实习面试是一天内走完所有技术面试流程,每一面结束后如果通过则15min左右就开始下一轮面试。
今日头条一面
1、有三个函数 fun A(b) fun B():b fun C():c。其中 A 需要在主线程执行,BC 需要在子线程,且 A 需要等待 B 操作完成的返回值,如果用协程实现这个依赖关系并尽可能快速执行完毕。 开始我用的withContext,面试官又让用async写一下。协程框架的底层是怎么实现的有看过吗?怎么理解suspend关键字?挂起函数一定会被挂起吗?
2、写一个java单例模式(DCL),kotlin中如何实现单例?(object)object的原理是什么?线程安全吗?
3、http协议相关:http和https的区别是什么,加密过程?Get能否修改服务器中数据?
4、点击事件的分发过程?有一个业务需求:想要监听当前界面中的所有事件,该怎么实现?Activity能否拦截事件?
5、Java如何实现泛型的?java和别的语言的泛型有什么区别?解释一下泛型的逆变和协变?kotlin的in和out关键字作用?
6、内部类有哪几种?静态非静态内部类区别是什么?匿名内部类中访问外部类成员变量为什么要用final?不用会怎样?
算法题: 给定一个二叉树和一个目标值target,写一个函数判断树中能否有一条路径(根节点到叶子节点)的节点的和为 target
今日头条二面
1、解释一下内存泄漏、handler内存泄漏原因?引用链是什么?虚拟机是如何判断对象是否可被回收的? 2、kotlin相比于Java好处是什么?kotlin对空指针异常是如何处理的?let、with、apply的适用场景? 3、Java异常机制、Error能捕获到吗? 4、我项目中账号密码是保存在本地的,怎么去保证安全?
算法1: 给一个数组,找出数组中第k大的元素 思路一:排序 思路二:优先级队列 思路三:使用数据结构堆
算法2: 手写快速排序
今日头条三面
- 自我介绍。你的项目中用了kotlin,能说一下kotlin相比于Java好处是什么吗?
- 你的项目中用了LiveData,能说一下它的原理吗?(源码没看过,简单说了一下观察者模式)
- http协议请求头都包括哪些内容?
- 计算机网络、操作系统、数据结构有系统学习过吗?
- 后端、web前端、iOS方面有接触过吗?(学过MySQL和一点点Spring)
- 你看过哪些Android源码?刚刚你提到了Handler,它是用来干嘛的?为什么要有Handler,自己写一个 线程间通信的代码不行吗?你提到了消息队列,它的作用是什么?消息队列和Handler一定要一起使用吗?
- 算法题 (1)用二分法在排序数组中找到绝对值最小的元素 (2)螺旋输出二维矩阵中的元素(不一定是方阵)
- 能实习多久?什么时候毕业?什么时候能开始实习?
- 反问 (1)大厂对于新技术的看法?敏不敏感?(大厂会第一时间学习新技术,但是真正用在项目中需要时间) (2)鸿蒙的出现会不会抢了Android开发者的饭碗?(不会,移动端之间转行很容易)
腾讯-腾讯游戏
腾讯面试涉及到的范围也很广,甚至问到了C++,也具有一定挑战性的,腾讯面试过程中的感觉就是很多我不太熟悉的知识点都被问到了,甚至是不知道的知识点,但整体面试官给人的体验还不错,一般会提前打电话沟通面试时间。
腾讯一面
50分钟(腾讯会议视频面试)
- 自我介绍,顺便展示了自己的项目,展示中出现了一个bug(尴尬),面试官问为什么会出现这个bug, 出现bug你会采用什么方式解决(查看log)?如果是企业级应用修复bug,你会怎么做?项目是你自己写的吗? 写了多久?
- 有用过Java集合类吗(说了ArrayList、LinkedList、HashMap)?说一下它们各自特点和内部的原理?
- Java中加锁的方式(sychronize和lock)?它们有什么不同?如果是高并发的场景,选哪个比较好,为什么?
- http协议和tcp协议相关
- 你项目中用了kotlin,能说一下kotlin相比于Java的优势吗?
- 你的项目中用了kotlin协程,能说一下协程的概念吗?协程底层实现原理有看过吗?
- 说一下Android事件分发的过程?
- View的测量、布局和绘制流程?自定义View需要重写哪些方法?自定义ViewGroup需要重写哪些方法? 区别是什么?为什么有区别?
- 你有写过自定义控件吗(说了一个树木生长的动画)?怎么实现的?
- 你项目中用的是okhttp+retrofit,为什么要用okhttp不用官方的httpUrlConnection?okhttp的好处是什么? retrofit是干什么的?retrofit和rxjava一起用的好处是什么?
提问环节:
(1)您对Google推出的jetpack compose怎么看?(面试官没了解过) (2)部门用Java还是kotlin?(新业务用kotlin,老的代码用Java维护,并不冲突) (3)部门加班情况怎样?(早10点→晚8点,挺轻松) (4)工作情况怎样,会不会天天开会?(一周开一次技术会)面试官又问了我天天几点去实验室,几点走 (5)能转正吗?(面试官也不清楚)
腾讯二面
电话面,20分钟
- 自我介绍
- mvvm架构相比于mvp架构的优点是什么
- 你比较熟悉jetpack的什么组件,它用了什么设计模式?
- 你对电子竞技的前景怎么看?
- 你项目中用了kotlin,kotlin相比于Java优势有哪些? 提问
腾讯三面
腾讯会议视频面试(20min)
- 用腾讯会议的共享屏幕功能,花了10分钟给面试官介绍项目(模拟器现场演示app的一些业务功能)
- 你并不是计算机科班出身的,你对本专业就业方向怎么看?你打算把Android开发作为以后的就业方向吗?
- 你做项目时候感觉对自己最大的提升是什么?
- 后续在Android方面你打算学习哪些东西?(说了NDK和flutter)
- 你觉得kotlin相比于Java的优势有哪些?
- 项目是你自己写的吗?用户量有多少?有没有考虑过版本兼容性相关的问题?项目出现问题你该如何解决?
- 项目准备用到实际生活中吗?开发完之后你是怎么测试的?
- 之前有没有过实习经历?
总结:面试官说我的项目经历挺丰富的,但是缺乏深度,需要去公司中体验一下企业级别的项目来提升自己的技术。
美团
美团面试是现场一天面完,技术面试一共两轮,最后有一轮HR面试,回忆起来似乎问的问题不是特别多,但都比较开放,聊的比较深入,技术一面直接打开美团APP聊相关页面设计实现,这种方式还是比较新颖的,二面则是聊项目比较多,问很多项目中具体实现细节。
美团一面
50分钟
- 你项目中用了MVVM架构,解释一下MVVM架构的思想?
- 你项目中用了kotlin协程,能说一下协程的概念吗?
- View层和Model层如何通信(LiveData)?DataBinding有用过吗?原理说一下?
- https如何保证安全的?加密、证书相关
- 线程和进程之间的区别?
- Android进程通信的方式?(共享内存、socket、Binder)它们各自有什么特点?
- 说一下Java虚拟机垃圾回收算法?
- 有用过flutter吗,还是只学过原生Android开发?
- 项目是自己写的吗?
算法题: (1)leetcode1:两数之和 (2)反转字符串中的单词:给一个字符串"www.meituan.com",将其变成"com.meituan.www"
美团二面
50分钟,牛客网
- 算法题:给一个double类型的数num,求它的平方根,要求精度为1e-8。(二分法)
- 家是哪里的?期望工作的城市有哪些?
- Java虚拟机垃圾回收机制
- 学过哪些设计模式?说一下Android哪些地方用到了适配器模式?
- 看过哪些Android方面的源码?
- 进程之间通信的方式有哪些?说一下Binder的原理?
- 对Reactive native感兴趣吗?
- kotlin相比于Java有哪些优势?
- 你项目中的app是如何获取到停车场车位信息的?
- 解释一下kotlin协程?协程和线程之间什么关系?
反问: (1)团队用Java还是kotlin?(kotlin) (2)Reactive native和原生Android开发区别?
快手
快手一面
牛客网视频面试,40分钟
- 自我介绍,开了屏幕共享展示项目
- 你项目中用了mvvm架构,能说说这个架构的思想吗?你项目中的进度条ProgressBar属于哪一层?处理点击事件的逻辑 应该放在哪一层?进行一次网络请求应该放在哪一层?
- 你项目用了kotlin,说一下kotlin相比于Java的优势有哪些吗?Java有lambda表达式吗?
- Java中==和equals的区别?kotlin如何判断两个对象内容相等?判断地址是否相等使用什么关键字?
- 在Java中重写equals时通常需要连带着一起重写什么方法(hashCode)?为什么?
- 进程和线程的区别?进程之间资源可以共享吗?线程呢?
- tcp和udp的区别?什么情况使用tcp,什么情况使用udp?
- http协议常见状态码有哪些?401是什么意思?405?
- http和https协议的区别?https中ssl握手的过程?
- tcp协议3次握手、4次挥手的流程说一下?
- 数组和链表各自特点是什么?描述一下哈希表的工作原理?
编程题:3个线程,交替打印1到100,即a线程打印1,b线程打印2,c线程打印3,a打印4……
百度
百度是现场面试,一共三面没有HR面,第三面是总监面,兼顾技术面与非技术面试,百度的面试官都比较友好,一面技术问的比较细,二面重项目,三面是聊天居多。
- HashMap中put一个节点的流程?
- ThreadLocal作用是什么,用在什么场景?
- TCP的拥堵机制和流量控制描述一下?
- http协议三次握手流程说一下?
- Android事件分发机制描述一下流程?
- Acticity有哪些启动模式?singleTask详细说一下?
- Activity生命周期相关的有哪些回调方法?在一个Activity中打开一个新的Activity,原有Activity哪些生命周期
- 方法会回调?如果打开一个对话框呢?如果对话框是透明的呢?
- Activity由于屏幕旋转、系统配置发生改变之后如何保证其中内容不丢失?可不可以让Activity不重新创建?
- 你项目中在二级页面中点赞文章,后退到文章列表中怎么让点赞数加一?
- 你的医疗物流机器人项目中app如何获取到机器人的速度数据?
- 静态内部类和非静态内部类的区别?当需要内部类时你更愿意使用静态内部类还是非静态内部类?
- 你项目中用的网络框架是什么?你还知道有哪些网络框架?为什么要使用okhttp?它的好处是什么?
- 解释一下动态代理模式?你刚刚提到了retrofit中用了动态代理,能详细说一下吗?
- 线程同步有哪些方式?
- 解释一下双亲委托机制?
- 描述一下View的绘制流程?
- Handler机制说一下?如何解决Handler内存泄漏问题?
- 现在有一个UI需求:实现一个柱状图的自定义控件,其中的柱有动画效果,说一下实现的思路?
- Java垃圾回收机制说一下?新生代老年代都有什么回收算法?
- Java虚拟机如何判断一个对象是否可以被回收?引用计数法和可达性分析说一下?你刚才提到了gc roots,
- 有哪些对象可以作为gc roots?
- 你项目中用了kotlin,谈一谈你使用kotlin之后的感受?
- 你对自己的评价?优点和缺点是什么?
- 有没有想过要转别的方向,为什么?
- 平时都有什么爱好?
- 在学校期间参加过什么社团?对你有什么帮助?跟社团成员有意见冲突时你会怎么做?
- 对未来有什么规划?说一下你在毕业之前的学习计划?
- 在学校遇到最大的挑战是什么?
算法题: (1)给一个升序链表,举例:1→2→3→3→4→5→6,删除链表中的重复元素(例子中为3) (2)手写二叉树的层次遍历 (3)手写二分查找算法 (4)找到两个链表的第一个重复节点(说思路)
阿里钉钉
阿里面试很喜欢问源码,优化,原理,涉及到的范围很广,还是具有一定挑战性的,阿里可以去找找内推(笔者实习投递时笔试做的差,本来以为挂了,但可能因为找的内推所以还是给我面试了,后续又加了一轮笔试,校招时也是找的内推直接面试了没有笔试)。
阿里一面
一个小时(电话)
先问了本科、研究生学过什么跟计算机相关的课(c、微机原理、其他自学)
- 浏览器输入网址后整个流程
- tcp、http协议相关;http1.1和2.0区别
- 堆排序的过程
- Java单例有几种方式
- 静态方法同步和普通方法同步的区别
- 线程池7大参数、工作原理
- 点击手机桌面应用图标后发生了什么(应用程序启动流程、Activity启动流程,没看过源码,没答上来)
- View三大流程说了一下,流式布局FlowLayout怎么实现的
- retrofit原理(没看过,只说了动态代理+注解),看过okhttp源码,讲了一下okhttp的工作原理(分发器、拦截器,讲了细节)
- 聊了项目(讲了好久),几个方面如下: (1)项目中用了kotlin协程,于是问了协程的相关理念,面试官可能觉得说的不太全,就给补充了一下。 然后说协程这样的新技术国外有人用,国内用的很少(因为使用协程会改变老项目原有网络架构,对于新项目 可以使用,想要取代老项目比较困难)。 (2)如果用户反应app有问题,该怎么解决?回答网络抓包,面试官说大型项目不可能通过抓包来找问题,后来 经过暗示,正确做法应该是生成日志文件并提交到服务器。 (3)聊了项目中登录相关的业务怎么实现的(将服务器响应的token持久化并添加到请求头)。 11、提问环节。问了面试官kotlin在企业应用中是否有用到,面试官说由于Java和kotlin并不冲突,因此在项目中是共存的。
阿里二面
一个小时(电话)
- 聊了研究生、本科阶段得过哪些奖,做过哪些项目或者参加过哪些比赛。具体问了本科参加过的一个水中 机器人的比赛(stm32单片机做的),怎么识别水中的路线之类的一些细节;又问了简历中的一个医疗机器人的项目(遇到了 哪些问题、只是实验室做着玩还是准备用在现实生活中);又问了参加过的数学竞赛,这个竞赛考察了什么能力等等。
- 问设计模式,Android源码或者第三方开源框架应用设计模式举例?(说了okhttp拦截器责任链模式) 自己的项目有没有用设计模式?(retrofit单例,用的kotlin的object关键字实现)
- Android源码中你认为有哪些方面设计的很优秀的地方?(说了Android view体系)
- 聊kotlin,kotlin相比于Java有哪些优势、具体有哪些特性、语法糖之类的
- 谈谈对mvvm、mvc架构的理解,为什么你要在项目中使用mvvm?(当然是Google推荐使用mvvm)
- 聊对工作、学习方面的态度,应该具备什么能力等等
- 三道算法题(说思路): (1)二叉树的最近公共祖先(只想出来一种比较笨的方法) (2)遍历二叉树的第k层节点(递归迭代都讲了) (3)给一个中文字符串“一万两千八百一十一”(只是个例子),输出这个字符串对应的数值(没想出来)
- 提问环节 问了部门的氛围如何之类的
阿里三面
40分钟
- 自我介绍
- 聊项目,mvc、mvp和mvvm架构各自的特点;在项目中最具有挑战的是什么?项目收获到了什么?
- 算法题:给两个字符数组,举例:{h,e,l,l,o, ,w,o,r,l,d}和{e,o},如果第一个数组中存在第二个数组中的元 素则去掉,后面的元素往前顺移,结果为:{h,l,l, ,w, r,l,d}。要求时间复杂度为O(n),空间复杂度为O(1)。
- 你认为什么样的人可以称之为技术大佬?如果只有30分钟,你会依据什么来判断一个人是不是大佬? 你认为自己身边最厉害的技术大佬是谁?他为什么会成为大佬?如果让你在半年之内达到他的水平,你的 学习规划是什么?你会不会向他请教学习方法?
- 反问: (1)大厂对新技术的态度是怎样的? (2)鸿蒙会不会取代Android?Android的前景怎样?面试官先问了我的观点,后来说了自己的观点:不会。 为什么不会?这个要自己查找最近几年出现的智能手机系统,它们为什么没有Android和iOS成功,从中找答案。
系统的面试复习路线
接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。
帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。 无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。
从架构基础开始,分了8个模块来逐步从基础进阶到架构师的环节。
多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!
-
架构师筑基必备技能: 深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
-
Android高级UI与FrameWork源码: 高级UI晋升+Framework内核解析+Android组件内核+数据持久化
-
360°全方面性能调优: 设计思想与代码质量优化+程序性能优化+开发效率优化
-
解读开源框架设计思想: 热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
-
NDK模块开发: NDK基础知识体系+底层图片处理+音视频开发
-
微信小程序: 小程序介绍+UI开发+API操作+微信对接
-
Hybrid 开发与Flutter: Html5项目实战+Flutter进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
历时半年,整理了这份市面上最全面的安卓面试题解析大全。
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。 2.五角星数表示面试问到的频率,代表重要推荐指数
以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者点击 【这里】 查看获取方式。
最后还有耗时一年多整理的一系列Android学习资源:Android源码解析、Android第三方库源码笔记、Android进阶架构师七大专题学习、历年BAT面试题解析包、Android大佬学习笔记
等等,这些内容均免费分享给大家。