Bilibili(获得Offer)
Bilibili 一面
- Activity的生命周期
- Activity 内存不足被回收时的生命周期
- Looper的工作原理
- Android 程序执行的内存使用情况
- GC是如何实现的
- 涉及Native层的内存如何管理
- JNI的工作原理
- 编译原理:一个CPP文件如何变成汇编语言,变成机器码,Java的代码呢?
- 拿到一个Jar包如何加log,用反射吗?反射了解过吗?
- Android P的API了解过吗?
- 面向切面编程?
- Android 如何处理UI和耗时操作,有哪些方式并简述各自特点和原理
- OOM产生的原因是什么?如何避免?
Bilibili 二面
- 比较详细的聊项目经历
- 如果你身边有个朋友想要学Android,你会建议他怎样来学。
后面比较玄学,没有聊技术,谈了一下人生,就过了,美滋滋。
总结
B站的整个面试过程是比较玄学的,一面的时间是9月29号,那时候我还没怎么复习好,很多知识点都没看过去。一面时候的问题除了几个比较常见的,还有像Android P的新特性、Native层的内存管理等几个问题我其实都没答上来。当时面完就觉得凉了,也没抱希望。过了两个星期,突然发来二面的通知,当时觉得特别不可思议。二面的时候,面试官是B站整个移动端的架构负责人,先是和我聊项目,这一块聊的还是比较深入的,比如项目中讲到了一个迷宫类的游戏,就问到了一个就是如何用算法去实现一个迷宫,当然我对这些算法都不了解,也回答的似是而非。但是面试官好像特别看好我,对我这块卡得不严,就说让我回去了解了解这方面的算法。单纯技术的话,二面是基本没问,后面问了一些实习的事,做的项目,然后问能不能去B站实习。最后给了一个比较肯定的回复,说会尽快发offer。这过程我其实是比较蒙的,因为自己觉得B站这边并没有表现的很好。后面了薪资的时候,提到了大疆和头条两个package比较高的Offer,B站这边给的薪资也很可观,但是更想去头条就拒掉了这边。
Keep
Keep 一面
- Java 的集合类用过哪些?ArrayList 是用什么来实现的?添加一个元素有哪些操作?扩容会扩容到原来的多少?添加一个元素的时间复杂度是多少?
- 如何判断一个链表是循环链表?如何计算循环链表的环的节点数?(快慢指针)
- synchronized 关键字和volatile 关键字有什么区别?
- ThreadLocal 的作用?
- Android 的Thread、Handler、Looper是如何工作的?一个线程可以有几个Looper?可以没有Looper吗?一个线程可以有多少个Handler?
- TCP 连接的三次握手和四次挥手的过程
- Activity的生命周期有哪些?Activity A 跳转到 Activity B 的过程中,两个Activity的生命周期调用流程。
- Service 有几种启动方式?如果一个Service既start,又bind,这时候调用stopService(),Service会不会销毁。
- Activity 和Fragment 之间如何互相调用对方的方法。
- 快速排序的时间复杂度是多少?写一个快速排序。
Keep 二面
- 介绍项目经历
- 讲一下 Java 的集合类
- Activity的启动模式有哪些?
- 自定义一个FrameLayout 来实现LinearLayout。
- Android 中实现异步的方式有哪些?
- Handler 出现内存泄漏的原因。
- 什么是内存泄漏?
- IntentService的使用场景,有什么好处?HandlerThread 的作用。
- ListView 中的缓存机制。
- 用到了哪些Android的图片加载库,之间有什么区别?
总结
Keep 最后是止于二面,二面面完后我其实心里有点数,可能就到此为止了。一面的时候,所问到的问题其实都是比较常见的,答得很顺利。记得在编程题的环节,面试官让我手写一个快排,其实原理都懂,之前复习的时候也专门练过一次,但是有段时间没看了,在写的时候对边界条件一直没考虑清楚,写了挺久都没写出来。估计面试官也是看我其他问题答得比较顺畅才给我过的吧。二面时,有几个问题对我来说有点偏,平时都没怎么注意,在复习的时候也没好好看,比如那个如何自定义一个FrameLayout 来实现LinearLayout、ListView的缓存机制(现在面试问ListView的比较少了,所以一直没细看这部分)。所以二面有些问题回答的就比较糟糕,最后二面面试官没有一面面试官那么仁慈了,就没有过。据说今年Keep 给的薪资也是比较高的,遗憾。
腾讯
腾讯提前批一面
- JVM中的内存类型有哪些?
- Object类中wait()、notify()、notifyAll()的区别联系。
- Activity A 跳转到Activity B 时,如果A的onStop() 方法在B的onResume() 方法之前会发生什么。启动模式会不会对这个过程造成影响。
- Handler 内存泄漏的原因是什么?
- 询问学校项目的经历和实习中的任务。
腾讯一面
腾讯的一面全程一个 Android 的问题都没问,问的基本上都是 C++ 和 Java 的知识。唉,心里苦啊。
- 自我介绍,介绍项目。
- C++ 和 Java 有什么区别?
- C++ 中的 const 关键字有什么用法?static 关键字有什么用法?
- 说一下 Java 的垃圾回收机制。
- C++ 和 Java 在继承上有什么区别?
- 用过哪些开源库?选择一个开源库的理由有哪些?
- 一个算法题:找出一个字符串中不重复的最长子串。
总结
还是太菜了,从实习到秋招,一共面了三次腾讯,就没有挺过一面的。而且有两次,都感觉很难受,因为面试问得大部分问题是 C++ 的问题,话说我面的是 Android 开发啊,这不是难为我这个彩笔吗。还有一次倒是集中于 Java 和 Android,但是问到的问题我答得都很差,也就没有后续了,想想还是很难受的。
今日头条(获得Offer,最终去向)
头条一面
- 计算机网络的整体结构
- TCP 的建立连接和断开连接的过程,这个过程中的状态转换。
- 介绍一下HTTP,有哪些方法?GET和POST有什么区别?使用场景有什么区别?有哪些Header?和缓存相关的Header的作用是什么?
- 说一下 JVM 的内存模型。
- 初学 Android 需要掌握哪些知识?
- 说一下 Android 的事件分发机制。
- Bitmap、Cannvas、Paint、Drawable有什么区别和联系?
- 手写二叉树的中序遍历。
- 对一个搜索关键字,进行高亮的需求,如何进行实现?如果有多个关键字重复高亮怎么处理?
头条二面
- HTTPS 的建立连接的过程?为什么后面用对称加密?
- Java 的finalize 方法如何调用?为什么要设计这个方法。
- Java 中的优先队列
- Java 的HashMap的实现原理?如何扩容?和Hashtable的区别?CurrentHashMap的原理,有什么特点?
- Android 的四大组件的介绍,Service是运行在主线程还是在子线程?Service可不可以有UI?四大组件中有哪些可以跨进程?进程的优先级有哪些?
- Content Provider 如何设置访问权限?
- 如何解决滑动冲突?
- Android 跨进程通信的方式有哪些?Binder的实现原理是什么?AIDL和Binder有什么区别?
- UI 卡顿如何进行优化?
- 如何进行异步通信,了解过这方面的开源库吗?
- 编程:二叉树的中序遍历
- 死锁是怎么产生的?
头条三面
- 项目介绍,问了很多关于项目的细节。
- Android Activity 的启动模式。
- Android 开发者可以使用的异步处理方式有哪些?(Handler、AsyncTask、HandlerThread、IntentService)IntentService和Service有什么区别?
- 项目中用到的网络库,RxVolley和Volley的区别。
总结
头条这次能获得 Offer,其实也有一些运气成分在其中。首先是一位学长给了我一个白金内推码,免去了笔试,不然以头条的笔试难度,还真不一定能过。其次是面试时间比较晚,所以准备的时间比较充足。记得第一次通知我面试是在 9 月中旬,当时确实时间冲突,另外对自己也不自信,所以看到可以后延面试轮次,就换到了 9 月底。结果那天前面排的人很多,面试官面不过来,就把我调到了 10 月 13 号的场次,也是幸运地争取到了一些时间。很多的机缘巧合加在一起,我在 10 月 13 号参加了头条的面试。
面试过程总的来说要求还是比较严的,特别是三面,后面会细说。在面头条的前几天,刚和大疆那边聊完薪资,给的挺多的,超出了我原本的预期,答应了大疆的Offer。所以面试那天的心态是很放松的,我觉得这也是其中一个因素。记得更早前面美团时,因为是第一次线下面试,紧张的不得了,很多明明知道的东西也没有很好地回答上,最后毫无疑问被淘汰了。而这次算是抱着试试即可的心态,没过还有大疆呢,在回答问题的时候比较放松,思路、逻辑包括表达可能会更好一些。
还有一个比较意外的小插曲是一面二面都有一道编程题,巧的是竟然考到了同一个知识点:二叉树的遍历。一面面试官让我写一个非递归形式的二叉树中序遍历,这个当时还是思考了一会,还好思路都还是记得,花了五六分钟写出来。二面的时候面试官让我写一个二叉树的深度遍历,那我当然是要发挥代码复用的优良传统啊,所以在假装深思一下后,很快就写出来了,二面也就过了。
二面其实有些问题我觉得是挺深入的了,都问到了跨进程通信的实现方式了,其实这个问题我也不怎么会,只答上来几种实现的方式,但对于底层原理也回答不上来,好在面试官也没特别揪着这个问题。
头条的三面是我经历过最严格的也是最惊险的一次终面了。之前面过的美团、大疆,之后面的B站、百度,终面的时候虽说会对项目的细节包括自己对计算机领域的认知、个人的规划等等展开提问,但都没有一次想头条的三面这样给我这么大的压力。原因在于他对项目的细节抠的太细了。我简历上写了两个在学校做的项目,说实话,这两个项目委实没有什么亮点,并且由于时间久远,一些细节都记不清了。但是面试官非常仔细地让我介绍了项目,并且对项目一些点展开提问,关键是问到的这些点正是这个项目本身的局限之处,我也不能很好的解释,这让我真的非常紧张,只能是尽量去解释当时的考虑。总之,三面的项目提问真的是我遇过的最细致的。所以,在制作简历的时候,一定要保证对简历上写的每项内容都有十足的把握,不会被面试官一深挖就崩。不要追求简历的丰富好看而强加没有把握的内容。后面的问到技术的时候,因为还是在Android开发这一块,反而压力小了很多,回答的也还好。三面结束过了一会,接到HR的电话说三面过了,心里非常开心。
百度(获得Offer)
百度一面
- 自我介绍,介绍项目经历。
- Activity的生命周期,各个生命周期的作用是什么?可以在onCreate中弹出一个Dialog吗?Dialog是被添加到哪里呢?弹出 Dialog 后生命周期会怎么变化?Activity之间是怎么传递数据的?可不可以传图片数据?Fragment怎么传数据?
- Android 的事件传递(拦截)机制是怎样的?
- 自定义View的步骤?如何让TextView的文字居中,如何在TextView中添加图片?添加了图片后图片是否会居中呢?如何实现让图片也居中?自己实现过哪些自定义控件?实现的思路是怎样的?
- Broadcast Recevicer是做什么的?它的底层是如何实现的?如果让你写一个本地的广播系统你会怎么实现?
- Java 的集合类用过哪些?LinkedHashMap用过吗?HashMap是如何实现的?介绍一下CurrentHashMap,TreeMap。
- Http 302 的状态码表示什么意思?你在项目中是如何实现网络连接的?有用到什么开源库吗?
- 编程题:如何判断一个字符是一个合法的IP地址?
- 你觉得你还有什么方面比较突出的可以跟我说的?
百度二面
- 接触Android多久了?介绍一下你做的项目?你在里面做了什么?
- 自定义控件需要注意哪些问题?
- Java中final的使用场景有哪些?作用分别是什么?
- 面向对象的特性有哪些?Java如何实现这些特性?
- 有几种创建线程的方式?之间有什么区别?
- 线程的同步如何来实现?
- 死锁是怎么形成的?如何来预防死锁的发生?
- 计算机网络中OSI七层模型是哪七层?应用层的协议有哪些?(HTTP、FTP、SMTP、POP3)POP3和SMTP是什么协议?(邮件)HTTP和HTTPS的区别是什么?SSL协议是什么样的协议?HTTPS中用到了哪几种加密方式?
- 用过哪些开源库?(答了Volley、Picasso、OKhttp、Retrofit)了解过源码吗?(答看过Volley的)画一下Volley的整体结构。OkHttp为什么这么多人用?优点在哪里?
- HashMap的实现原理?
百度三面
- 自我介绍。详细介绍项目,在其中的工作。在项目中投入的精力、时间等。项目的立意是怎么来的?为什么要做这个项目?有老师介入项目吗?
- 你最近看了什么书,和技术有关的?给你印象最深的是什么?有哪些收获?
- 学过哪几种语言?如果让你学一门新的语言,你多久能掌握它?(答两周掌握语法结构)如果我给你一周时间,让你去学习Go这门语言,一周后写线上业务,你会怎么学?
- 讲一下Android中的消息机制。它有哪些优缺点?
- 设计模式了解过吗?用过哪些设计模式?工厂模式的类图画一下?
- 在开发中有遇到过OOM的问题吗?如何来避免OOM的出现?(答到了使用缓存)缓存是用在什么样的场景中,是为了解决什么问题?LRU算法是一个什么算法?
- Java的GC了解过吗?虚拟机是如何实现垃圾回收的?有哪些回收方式?
- 你觉得你在开发的哪些层面表现比较好?是UI层、还是逻辑层?你最近做过的自定义控件有哪些?最有难度的是哪个?
- 了解过哪些开源库?(答的Volley)有看过源码吗?它的设计里有哪些优秀的地方?
- 对百度有哪些了解?对魏则西事件怎么看?(后来主管还对这个事件做了一些解释)
- 在哪里实习?实习主要做哪些工作?公司有给你发offer吗?
- 还参加了哪些公司的招聘?手里有哪些offer?如果我们这边也给你offer,你会怎么选?
- 有什么问题想问我的?
总结
收到百度面试通知是在10月10日,面试安排在10月21日。这期间,收到了头条、B站的Offer,最后选择了头条,和头条签了两方。之后,拒掉了之前海投的一些公司的面试,像贝壳、快手,但还是决定来试试百度。毕竟BAT是每个IT人的梦想,阿里错过了内推网申,腾讯不管是提前批还是正式流程都倒在了一面上,百度是最后一个机会。其实有点衡量衡量自己的水平的意思,看看能不能够得到BAT的门槛。
百度的面试流程也是三轮,并且是现场随机分配空闲的面试官。每个面试官有自己专门负责的方向和轮次,比如IOS一面,Android二面这些。一面过了就去看哪位二面的面试官空闲,然后直接开始面。
一面二面大部分问题都还是比较常见的,这里就不细说了,值得一提的是三轮面试都提到了一个内容:开源库。三位面试官都问了我平常开发中用过哪些开源库,像一面二面的面试官是很明显的想问我OkHttp的内容,但是我OkHttp原理的东西不懂,还停留在用的阶段,所以没有正面的回答他们,重点说了自己看过源码的Volley这个网络库。然后像三面的时候就问到有没有看过开源库的源码,能从中学到哪些优秀的东西,要求还是有点的。
在一面的时候,面试官问我“你觉得你还有哪些方面比较突出的可以和我说的”,三面的时候,面试官问:你觉得你在Android 开发的哪个方面比较有优势?为什么?这两个问题我觉得其实难度比那些技术问题还要难上一些,因为它是一个半主观的问题,要如何表达自己的优势,同时避免过度吹嘘,又如何证明自己具备这些优势。就感觉既考验你的实际水平,又考验你的表达能力。
还想说一下三面的过程,三面的面试官真的是非常Nice。上来先自我介绍,说了自己的名字,工作的部门(百度网盘的技术主管),是我面试这么多次第一次知道面试官的名字,感觉还是很不一样的。在比如OOM的问题上,我本来对这块不熟悉的,如果他深究下去是肯定会很尴尬的。但是后面他给我一些引导,就慢慢回答到缓存,包括LRU算法,还给我循序渐进的解释LRU算法。后面面试官问我怎么看待魏则西事件,说实话我是绝对没想过会被问到这个问题,因为它无疑是百度的一个软肋,而现在面试官直接摊开来问我怎么看,让我着实感到意外。我对于这个事件确实也有一些想要说的实话吧,反正就一股脑的说出来了,大意是搜索对于现在的人们过于重要,百度既然做了这个领域,就必须有这个社会责任感。说完后,面试官非常认可,也和我非常开诚布公吧,说道这个事件确实是百度的一个痛点,他们也非常正视这个事情,解释了这些事情背后的一些原因。百度的三面和B站的二面算是体验最好的终面了。