2020ABT精选面试题,共550页PDF干就完了!(以及疫情期间面试经历分享)

前言

本人水平有限,此文针对于自认为技术实力对标阿里P6,百度T5或者以下的读者,如果是大佬不小心点进来了,可以自行点x略过。文内并不会出现每一家公司的面试过程细节,主要目的在于帮助大家怎么在像我一样菜的情况下在这寒冬拿下offer或者说有复习准备方向。(文章纯干货分享 请仔细阅读

背景介绍

11月因公司团队解散而离职,突闻互联网最寒冬又双叒叕来了,什么小厂大量倒闭,大厂裁员或锁HC,慌得一批,惶惶不安准备了一个多星期后,开始踏上面试求职之路,截止最终确定入职单位总计用了二十多天(期间有一半时间在做颈椎康复治疗)。

求职开始于某个周日晚上十一点把简历公开到猎聘,第二天开始就被猎头的电话打爆(对这个所谓寒冬有点疑惑),按先后顺序面了xxx体育资讯(搞BC的)、xx者科技(技术方向不同,去了几乎没怎么面就让我回家了)、腾讯音乐(电话一面挂)、技威时代(智能家居方向)、悦动圈(跑步运动,用户量过亿)、顺丰科技、OPPO、百度(止步现场第三轮技术面)、头条 ,加粗的是拿到offer的,最终入职了头条。

个人简介

本人二本渣院毕业,非科班出身,三年多Android开发经验,半年iOS开发经验,和一个JavaScript小游戏开发经验。技术水平,略低于百度T5的样子(去百度面过,止步第四轮技术面)。一直在创业小厂工作,团队总人数没超过90人过,绝大多数时间处于独立开发,也就是一个人负责一个APP,甚至同时负责多个APP。技术栈得益于产品汪频频更改的需求,还是积累了不少广度,但是因为人少活多,精力有限,所以深度还是有所欠缺。

面试准备

  • 简历攻略

首先从企业招聘端分析他们想看到什么样的简历,一般看简历的有三种人,猎头、HR、技术负责人。猎头和HR关注的点比较近似,放一起说,这两者一般比较关注工作经历、项目经验、掌握的技能点是否和用人单位JD匹配,对于工作年限低的,比如三五年以下的,还会关注学历,尤其是大厂,比如本科是很多厂的硬性要求,因为HR看简历的时间有限(我猜的,大厂投简历的人那么多,肯定看不过来啊),HR还会关注你在过往的经历中的产出成绩,能量化的最好。对于技术负责人,主要关注的就是你所熟悉的技术栈,和项目经验了,也许会因人而异,这个可以换位思考,如果你想找一个队友,你期待你的队友是怎样的一个人。

我对简历的理解是,对自己的基本情况做总结形成你的人设,**目的是让用人单位对你感兴趣,获得面试邀约。**简历格式用PDF,两页最好,如果你觉得你足够屌,可以一页。注意排版要整洁,自我认知要客观,别什么精通xxx张口就来,除非你是真的精通,已经完全不怕被面试官问倒的程度,反正我一个精通没写。

对于什么教育程度、自我评价、专业技能点、工作项目经历之类的用什么顺序写之类的,我觉得没有一个固定的标准,我的建议就是以突出自身亮点、优势,扬长避短为原则的优先级排序。比如你是985的学校毕业的,但是工作履历不出彩,可以把学校放前面,我因为专业不是计算机类的,为了防止被HR刷掉,我只写了xx大学,本科,事实上一般技术面试官也不是那么看重专业出身的,就我经历的几个厂面试而言,我在自我介绍时主动说明了我的专业出身,面试官一般也会表示理解。那如果,学历不够出彩,但是之前公司背景屌或者说做过的项目比较知名比较屌,例如用户量、日活很多之类的,那么就可以把项目经历写在比较靠前醒目的位置。

如果自己有写高质量博客的好习惯,或者在GayHub上有star比较多的开源项目,可以写在自我评价里,作为加分项,因为本人这两者都没有,所以我自己没写自我评价。

有朋友问我,技能点该怎么写,写多少写什么比较合适?这个主要还是要看个人情况,我只能提几点供参考的建议,把你的技术栈提取出亮点来,把你的亮点和理解的最深的有门槛的技术写在靠前的位置,可以参考下你目标公司的jd需要什么,你把你会的写上去,不要写太多,也不用写那些一眼看上去没啥技术含量的东西。可以适当的抽象一点,不用具体到点,举个例子,熟悉常用的数据结构与算法,肯定比熟练运用HashMap、ArrayList,知道快速排序原理要强。

项目经历怎么写?那还就是用著名的star法则,即情境(situation)、任务(task)、行动(action)、结果(result)。在什么场景下,采用了什么技术方案,取得了什么成果,通俗来讲,还是提取项目中的技术亮点和能体现你能力的地方。比如说,对应用启动的做了xx优化,启动速度快了30%,比竞品厉害了多少。

还有很多人最关心的,面试题一般都问啥?很简单,一部分从你的技能点发起提问,一部分从你的项目经历发起提问,从这个角度来看,你是在给****你自己设计考点,想要证明你的实力,那么你就在这两个地方多花点功夫,把你简历上的东西琢磨深一点,不被面试官问起来虐到就行。因为你能进入面试环节,就说明用人单位,通过简历对你的“画像”基本能达到录用需求了,你只需要在面试时表现出来,你简历上的不是吹牛B,而是真正的你,那么不说能拿多少钱,至少offer是稳了。

  • 投递渠道

我自己在这过程中几乎只用了猎聘、BOSS直聘,拉钩也公开了简历,但拉钩只约过一家,基本都是猎头推荐和BOSS上的招聘方主动联系我。

高频题集

下面的题是混合了我面过的公司中还记得起来的题目,每个类型都大致是按照出现频率倒序排列的,有些题目其实只是一系列问题的引子,让面试官和候选人打开话题的。

基础题

网络相关

Https的原理?
Tcp和Udp的区别?
Http的报文结构?cookie是用来干嘛的?有哪些响应码,分别都代表什么意思?
有自己实现过Socket协议吗?

多线程

Sleep()和wait()的区别?
Java有哪些线程池?他们的区别是什么?线程池工作流程是怎样的?线程池实现原理是怎样的?Cache线程池有哪些弊端?
多线程间的通信方式?
synchronize关键字怎么用的?还知道哪些同步的方式?
Thread直接调用run方法会怎么样?start方法作用是什么?
volatile关键字的作用是什么?
怎么安全停止一个线程任务?原理是什么?线程池里有类似机制吗?

数据结构

HashMap和HashTable的区别?和 ConcurrentHashMap 区别?和LinkedHashMap区别?内部实现原理?
LRUCache的原理?
ArrayList和LinkedList区别?为什么ArrayList不是线程安全的?
数据库的索引用的什么数据结构?

虚拟机

垃圾回收机制?有哪些对象可以作为GC roots?
跟Art、Dalvik对比
Java内存模型?
类加载机制?双亲委托模型?

其它

用过哪些设计模式?DCL单例模式为什么要两次判空?Android里源码或者你用过的开源库都用到了什么设计模式?
— final关键字的作用?
静态内部类和内部类的区别?
值传递类问题
Kotlin为什么能和Java混编

Android题

你有什么亮点?项目中遇到过什么难题或者坑,怎么解决的?
做过哪些性能优化?是怎么评测和具体优化的
Activity的冷启动流程?AMS的作用?
怎么分析内存泄漏?
View的事件分发机制?滑动冲突怎么解决?
自定义View的原理和流程?
Handler原理?(一般会花式扩展)
有哪些多进程通信方式?Binder机制?
Android的生命周期和启动模式相关?
你项目中用到哪些开源库?说说其实现原理?(OKhttp、RxJava、Retroit重点,如果有用到的话)
Android的打包流程?apk里有哪些东西?签名算法的原理?
了解哪些插件化技术?
LinearLayout的布局流程?
对Mvp的理解?
Android怎么做保活?

算法

排序相关的(快排,分析不同排序区别,时间复杂度等)
字符串、数组相关的(滑动窗口、双指针)
链表(反转链表)
递归、斐波那契数列(爬楼梯)
动态规划

所有的大厂的面试题,我都打包整理好了,需要的Android程序员 加入我们
Android高级架构师的圈子:894230989 我分享给你。

或者直接点击下面链接领取
Android学习PDF+架构视频+面试文档+源码笔记

答题技巧

分析考点

技术面是一场技术面试官对候选人的综合评估

先从面试官角度来分析,在面试过程中的对候选人一些考查点吧。知己知彼百战不殆,面试过程中逆向思考一波,有助于我们怎么应对技术面。

候选人人设是否跟简历一致

主要看候选人是否坦诚真实,这个会直接影响能不能通过。候选人上的项目经验和技能点应该尽可能与候选人匹配,比如说,候选人说做了XX项目,但是问起是怎么实现的,却答不上来,或者说熟悉xx技能点,却只会调用常用的api,对其源码细节一点都不熟悉,那多半是不给过的。如果候选人要吹牛B,能拿出能圆上吹牛B的实力,也是可行的。比如说某某模块其实是你同事做的,但是你也完全理解了,可以应答如流,面试官是不会计较的。

技术的扎实程度和项目经验匹配程度

考查包括对技术的理解和解决问题的能力,包含一些细节,运用的场景,实现的原理等等,目的是为了测试候选人技术水平上限。答得越清晰,越深入,对细节掌握越牢靠越好,不一定需要全部答出答完美才能拿到offer,但这些题回答的效果最能影响到offer能谈多少钱。小厂偏重于技能、项目经验匹配度,大厂偏重于基础、原理。小公司,面试官通常希望候选人尽快上手,就希望候选人有类似竞品或者功能开发经验的候选人,所以也可以从这些方面做准备。大公司呢,可能会提出一些场景来考查候选人怎么设计,这就要求候选人功底深厚,逻辑严谨了。上面的题集我没写答案,因为我觉得很多题本就没有标准答案,也没有必要背题的“标准答案”,优秀的回答,应该是形成自己的理解输出的,说的有理有据就行。

候选人亮点、优势

一般是作为候选人的加分项,或者是面试官为了更快的打开话题,了解候选人的优势,并测测候选人的优势到底屌到什么程度。这个问题回答好了,候选人甚至能翻盘。

沟通能力

在一线搬砖过的应该都懂,每天正正经经写代码的时间通常不到一半,还得花不少时间跟产品撕,跟后台撕,跟UI撕等等。所以沟通协调能力也是很重要的,候选人需要理解面试官出题意图,表达要逻辑清晰。最好是候选人能跟面试官建立起讨论技术的氛围。这方面很容易被多数候选人忽略,但其实挺重要的,面试官也许不能直接决定要你,但是一般可以直接决定淘汰你,候选人要不卑不亢,保持谦逊。候选人技术再屌,态度傲慢的话,也是很容易翻车的,但也不能太怂,显得没有技术底气,所以最好是和谐的讨论氛围。

学习能力,自驱性

一般总监或负责人会比较关注这个。

答会的问题

要听明白面试官的出题意图,也就是注意审题,不要答非所问,如果对面试官提出的问题不是很理解,及时进一步沟通,把问题问清楚,这也体现了沟通能力,毕竟平时工作时,也会接到一些不是很清晰的需求,自己主动获取更清晰的需求也是程序员的优秀素质。
回答要尽量清晰准确,最好能答到问题的本质,展示出你对技术的更深层次的探索和挖掘。同时要注意面试官的反馈,这时候就要察言观色了。
如果面试官听的津津有味,并不断追问加大问题难度,那么恭喜你,你回答的很好!
如果面试官表现得有点不耐烦,那就精简下回答,毕竟面试时间有限,去掉那些啰嗦的话和题目关联不大的东西。
如果发现面试官问的题越来越简单,越来越常规表面,那么就得警惕下了,可能是你之前的回答太一般,让面试官觉得你比较菜,所以就不给你出难题了,这种情况就算最后给到offer,多半价格也谈上不去了,甚至还可能是为了给你个台阶下,然后让你回家等遥遥无期的通知了,这种情况下就得把问题回答得更深入一些了,知道多少答多少,尽可能主动展现出自己的水平来。

答不会(不确信)的问题

首先要对这个问题有一定的思考分析,不要轻易的说不会,但也不能完全不会还瞎答,完全不会的还是要敢于说不会,坦诚也是必要的素质。
如何思考分析呢?以我的经验来看,主要是从问题的关联知识或者可替代方案的角度来思考。对问题不是很清楚了解的时候,尝试从已知的相关联的知识点来做出合理推测,比如从一些开源库里面借鉴思路,或者从Android源码里面借鉴思路,但是这种情况就得跟面试官说清楚,你是推测的,还要说下为什么要这么推测,避免面试官误以为你不懂装懂。还有一种方式,就是你也提出一个可替代的能解决问题的方案。

猜你喜欢

转载自blog.csdn.net/Android725/article/details/106365109