Android开发2017秋招总结+面经

博主分享了自己2017年秋季招聘的准备、经历和结果,详细记录了在腾讯、小米、美团和网易的面试过程,包括每个公司的面试内容和题目,强调了心态在面试中的重要性。此外,博主还提到了自己通过刷题、复习基础知识和准备项目来提升能力的方法。
摘要由CSDN通过智能技术生成

背景

在经历了春招沉重的打击(0offer)之后,我终于明白了自身实力与现实的巨大差距。但很不幸的是,我依然没有拿出百分之百的努力,一堆琐事和懒惰的心态阻止了我的步伐,导致我在8月初才开始认真的准备秋招。

ps.
1. 面经放在了最后,不想看总结的可以直接跳过。
2. 脚注是我对于秋招的各种心得体会,为了不影响阅读全部放在文章结尾。


准备

首先我需要对我自身进行一个分析,寻找最适合我的准备方法。

个人条件

先说一下秋招开始时的个人的条件吧,毕竟我的方法可能不是每个人都适合的,只能作为参考。

  • 211本科,计算机专业。
  • 有一两个独立完成的个人项目/demo(Android)。
  • 没有获奖经历
  • 没有实习经历。
  • 计算机基础的深度一般,但广度凑合(就是平常上课都有听过,但都不认真)。
  • 很少刷题。
  • 在学校的仿真机器人实验室呆过两年,担任 队长。

优势

  1. 个人项目均是自己认真做完的,可以仔细聊聊,在项目上可以拓展各种知识点。
  2. 在实验室付出了很多心血,对整套架构了如指掌,可以仔细聊聊实验室的经历和收获。

劣势

  1. 学历不够,非985本科或研究生。
  2. 没有实习经历,无法了解到真实的业务场景。
  3. 刷题不够,手撕算法能力不够强。
  4. 计算机基础深度不足,容易被问死。
  5. 项目难度不足,没有太多亮点。
  6. 缺少重量级奖项(acm之类的)。

分析

  • 由于劣势1,2,6,我的简历很难写的出彩,也很难走内推通道。
  • 由于劣势3,4,5,在面试时缺少亮点和深度,无法让面试官留下太深的印象。
  • 由于优势1,2,我在聊个人经历时有很多可以说的内容,可以充分展现我的业务能力和开发基础。

需要做的事

  1. 提高刷题量,增强算法能力。
  2. 在Android方面加深基础,多看面经。
  3. 持续的修改简历,突出亮点。
  4. 增加获奖经历。
  5. 复习科班基础。

过程

  • 为了提高算法能力,我刷完《剑指offer》,了解面试官出题的套路;还在LeetCode上AC了20多道Hard难度的题,在牛客上AC20多道低通过率编程题,加强手撕代码的能力。
  • 为了加强Android基础,我看了以下书目1
    • 《深入理解Java虚拟机:JVM的高级特性与最佳实践》
    • 《Android开发艺术探索》
    • 《Android源码设计模式解析与实战》
    • 《深入理解Android内核设计思想》
    • 《Android开发进阶 : 从小工到专家》
  • 为了提高计算机基础,我复习了以下科目2
    • 计算机网络
    • 操作系统
    • 计算机组成原理
    • 编译原理
  • 在网络上搜集相关面经,主要是BAT TMD NJ的Android岗位的面经,在看面经的时候我会尝试回答每个问题,看看自身掌握如何,不会的及时找到答案并弄懂。
  • 由于对内推不抱希望,我在牛客网上刷大量的笔试题。希望通过提高笔试能力,能尽量拿到参加面试的机会。
  • 关注相关的内推与秋招消息。经常刷牛客、V2EX、知乎、脉脉和各种技术交流群,不放过各种内推或者补录的通知。
  • 拿奖,增加简历亮点。在秋招期间,拿到了国赛三等奖,省赛一等奖,还有普通编程大赛的奖项。虽说奖项的含金量不高,但起码提高了在简历筛选关的通过率。
  • 反复修改简历,不断的试错3
  • 熟悉项目,仔细发掘项目相关的知识点与技术点并掌握它们4。比如我的一个项目VectorMap用到了自定义View,我就仔细了解并记住自定义View的相关知识点,像是触摸事件分发的原理,View的绘制流程,Window Activity View之间的关系等等。
  • 通过大量的面试锻炼心态,增强面试稳定性5。尽量做到和面试官谈笑风生,会的讲得清,不会的(心态)稳的住。

结果

线下宣讲会

  • 投了简历
    • 中兴
    • 用友
    • 北京华宇
    • 福建顶点
    • 百度外卖
  • 参加笔试
    • 用友
    • 北京华宇
    • 福建顶点
    • 百度外卖
  • 参加面试
    • 中兴
    • 用友
    • 北京华宇
    • 福建顶点
  • 拿到offer
    • 中兴
    • 用友
    • 北京华宇
    • 福建顶点

内推

  • 投了简历
    • 阿里
    • 腾讯
    • 网易
    • 今日头条
    • 美团
    • 科大讯飞
    • 苏宁
    • 携程
    • 迅雷
    • 滴滴
    • 搜狗
    • 爱奇艺
    • 链家
    • 饿了么
    • 58
    • 欢聚时代
  • 参加笔试
    • 携程
    • 链家
    • 网易
    • 58
    • 滴滴
    • 搜狗
    • 爱奇艺
    • 今日头条
    • 欢聚时代
  • 参加面试
    • 网易
    • 今日头条

未拿到offer

校招

  • 投了简历
    • 阿里
    • 腾讯
    • 网易
    • 京东
    • 美团
    • 小米
    • 拼多多
    • CVTE
    • 招商银行信用卡中心
    • 微策略
    • 猿辅导
    • 猎豹移动
    • 好未来
  • 参加笔试
    • 阿里
    • 腾讯
    • 网易
    • 京东
    • 美团
    • 小米
    • 拼多多
    • 招商银行信用卡中心
    • CVTE
    • 微策略
    • 猎豹移动
    • 好未来
  • 参加面试
    • 美团
    • 腾讯
    • 小米
  • 拿到offer
    • 小米
    • 美团

补录

  • 投了简历
    • 腾讯
  • 参加面试
    • 腾讯
  • 拿到offer
    • 腾讯

心路历程

整个秋招过程还是很戏剧性的。
1. 首先,花了一个多月的时间参加了大量内推却一无所获,开始怀疑人生,心态爆炸,压力骤增。
2. 接下来,为了调整心态参加线下宣讲会,拿到了多个小offer,熟悉了面试的环境,增强了自信心,为之后的offer奠定了基础。
3. 参加校招,顶住压力在大量的笔试之后终于拿到几个面试机会,接着奇迹般地获得了小米sp和美团的白菜,但挂掉了最想去的腾讯。
4. 最后,发现了补录机会,抱着试一试的想法投了简历,机缘巧合之下参加了线下面试,最后竟然成功拿到腾讯的offer。

经历了秋招之后,发现心态是最为关键的因素。拥有一颗强大的心脏是成功的基础。经历失败后的反思与总结,多次失败后心态的调整与恢复,成功后不骄不躁的心态,都是未来继续发展不可或缺的元素。

ps.
在秋招的三个月,总有许多灰暗的日子,在最痛苦的时刻,我的女朋友给予了我支持和鼓励,真的非常感谢她。


面经

均只有技术面

腾讯

一面 四十分钟

聊项目,问问题
看过哪些android源码
asynctask原理
intentservice原理
service默认运行在哪个线程
算法 一个数组中有两个数只出现了一次,其他都出现了两次,找出那两个数

二面 一个小时

编程 使用纯c对一段话进行词频统计
物理上存储一个空文件是否占据设备空间
一个100B的文件存储到物理设备上占用物理空间大小会是多少
平衡二叉树是什么
https的作用与原理,证书的作用与包含的内容
客户端向服务器发送3000字节数据tcp包的流程
说一个项目难点
说一个你提高自己的过程
说一个如何制定计划的过程

加面 25分钟

问项目,项目细节
图片文件有哪几种格式
jni函数调用的具体实现
进程线程区别,线程切换的具体实现
算法 现有一系列区号和对应的地区名称,如何最高效率的识别某个电话的区号所代表的地区,时间复杂度多少
路由器转发数据包的具体实现
智力题 三个框,两个红球一个白球,随机放球到框中。求第二框至少有一个红球的概率

小米

一面 1个小时出头

个人介绍
聊项目,展示项目,问问题
介绍binder,如何控制binder的访问
i++是否线程安全,如何保证线程安全,volatile是否可以
hashmap实现,是否线程安全,如果多线程进行操作会发生什么
如何使一个线程进入destroy态
编程 判断某个数的各位平方和是否收敛,意思就是最后变成1 收敛,最后循环到之前的一个数 不收敛
对未来的发展规划
拿到哪些offer了,如何给你发offer怎么选择
死锁的发生条件
JNI
是否下载过android源码

二面 半个多小时

自我介绍
编程 二叉树两节点的最近公共父结点
学过哪些专业课,根据专业课问了些问题
数据库ACID是什么,原子性的体现
虚存是什么
虚电路与存储转发的区别
TCP协议可以在虚电路上运行么
路由选择协议有哪些(我竟然忘了……)
ps.面试官应该不是做安卓的

加面 一个小时

自我介绍
四大组件
service使用场景
后台service和后台线程的区别,service如何实现跨进程通信
描述一下AIDL和binder工作原理
binder如何做到数据的跨进程传递
内核空间与用户空间的区别
进程与线程的区别
线程的调度由谁实现
听说过协程么
死锁的发生情景
handler的工作原理,handler对象在哪个线程存活
如何实现blockingqueue
synchronized和Lock的区别
volatile的实现原理
介绍http
http如何保持状态
cookie的工作原理,存放位置,cookie可以被修改么,如何验证cookie有效未被篡改
http相对于https有什么问题
介绍https工作原理
MVP与MVC区别
聊实验室项目
工作意愿
算法 最长递增非连续子序列长度
编程 逆时针打印递增矩阵

美团

一面 一个半小时

自我介绍
介绍项目(聊了不少,最后说 你这个项目还挺有难度的啊……)
项目问题
如何解决OOM的问题
自定义view如何绘制旋转移动
matrix如何使用
xml解析器有哪些,各有什么特点
rxjava的特点与优缺点
retrofit为什么使用接口,底层使用什么实现的

java的多态
sleep wait方法的区别
synchronized关键字的具体特点,可以修饰哪些东西
synchronized修饰静态方法和非静态方法的区别
Lock的特点,和synchronized的区别
项目中有关于锁的优秀实现么(没有……)
handler的原理
looper的工作原理
asynctask的原理,同个进程中有多个asynctask实例会互相影响么
编程 判断二叉树对称
四大组件
activity启动模式
组件的注册方式
broadcastreceiver动态注册和静态注册的区别
listview性能优化
http状态码
如何优化一个算法

二面 一个小时

自我介绍
列举一下各种排序算法
快排的时间复杂度以及计算方法
如何看待排序算法的稳定性
冒泡是稳定的么?快排呢?
进程和线程的区别
linux跨进程通信的方法
有哪些GC算法,各有什么特点
android的service的实现描述
serverservice干什么的
binder的实现
binder使用的基础技术是什么
ams干什么的,如何使用
四大组件
启动多个activity,如何直接退回到最底层activity,会回调什么方法
触摸事件传递,当view在ontouchevent中接受到down事件同时返回false会发生什么
数据库事务的特点
虚存的原理
LRUCache的原理
hashmap的原理,hashmap链表太长的处理
tcp/ip结构
如何学习(个人经历)
rxjava的特点,subscribeon和observeon是干什么的
注解的作用与特点
0 1背包和完全0 1背包问题的区别
编程 实现循环队列
编程 遍历viewtree

三面 一个小时

个人介绍
一个app点击一个按钮请求数据后会做哪些事,画图演示
后台接口与客户端不一致如何解决
项目中遇到的最难的问题,为此做出的努力
http版本
http长连接在哪个版本强制启用,如何关闭
http状态码分类,各个具体状态码的含义
jdk7 相对于jdk6改变
jdk8相对于jdk7改变,包括jvm
jdk7 内存分区,回收器
cms回收器
编程 求数组交集
对美团的看法
对美团APP的建议

网易

一面 40分钟

个人介绍
项目介绍
项目如何进行网络通信,HTTPUrlConnection如何实现输入输出流?
Retrofit的原理
Https的原理与作用
LruCache的原理与底层实现方法
HashMap的数据结构
HashMap与HashTable的区别
如何处理多线程的数据同步
synchronized和lock的区别
实现一个单例模式
Activity生命周期介绍,按Home之后的生命周期如何变化
是否使用过service,介绍其作用
聊项目,问问题
如何实现listview的拖拽
是否使用过图片加载开源框架
如何读取超大图
如何自定义view
遇到的项目难点
聊实验室经历
为什么要从事Android开发

二面 35分钟

聊项目
Handler的原理与实现
为什么有些Handler不能更新UI
MainLooper在哪里进行初始化的
如何启动线程
如何结束线程
interrupt方法一定能中断线程么
AsyncTask的实现
你觉得使用架构最难的地方是什么
Android sqllite 数据库并发如何实现
Activity按Home键到后台再返回时的生命周期
当Activity按Home键到后台时如何保存数据,具体会调用哪些方法
如何保证在横竖屏切换时生命周期不变
SparseArray和HashMap的区别,SparseArray是否线程安全
HashMap与HashTable的区别
Service是否用过
sqllite 事务是否了解
Android如何调用c++代码
Java对象与C++对象如何转换
最复杂的项目是什么
自定义view如何实现
view如何处理绘制的内容缩放
项目的难点在哪
如何处理数据回调显示在页面上
如何从A进程知道B进程的Activity是否存活
rxjava和retrofit的底层实现
如何编写代码比较两个对象
==和equals的区别与使用场景
觉得自己在java还有哪些方面需要提升
java和c++面向对象的区别
项目中如何做内存调优
项目中如何控制内存泄漏
有没有使用过第三方工具调试内存泄漏
匿名内部类会导致内存泄漏么,为什么
如何学习Android
觉得自己是否适合做Android开发
有没有改造过Android事件分发机制
如何解决滑动冲突

今日头条

一面 一个小时

项目介绍
自定义view相关
如何绘制大于父view的子view
点击事件流程
发送网络请求的过程
网络连接失败的原因
http&https
网络劫持
java类加载过程
android.view由谁加载
编程 字典序第k大的数
MVP设计模式
retrofit的了解

二面 一个小时不到

项目介绍
view的事件传递机制
activity的生命周期
restart方法的调用时机,按home键的调用时机,恢复的调用时机,销毁的调用时机
on save/restore instate的时机,谁调用,怎么调用,当view没有设置id还有没有效果
bundle的数据结构,如何存储
listview内点击buttom并移动的事件流完整拦截过程
多点触控如何传递
service的意义
android的IPC通信方式,是否使用过
service如何实现跨进程通信
android的多线程机制
asynctask的原理
handler原理
app启动后是怎样运行的(我答的是mainlooper死循环)
java的容器种类和原理
hashcode的机制与实现
线程池的种类,有没有用过
http的版本有几种
http请求包结构,有几种contenttype
http返回码的分类,400和500的区别
编程 按格式打印view和它的子view


  1. 前两本都是相当重要的,面试官非常喜欢问上面的知识点。为此我花了几天的时候从头到尾看了一遍,并在之后不断的复习;设计模式也是一个很重要的知识点,第三本书结合了Android源码分析了相关的设计模式,非常适合了解Android组件的工作原理同时补充设计模式的知识点;后面两本我个人看的不多,没有太多建议,想要冲击Android底层原理的我推荐可以看看第四本。
  2. 前两门非常重要,在我面试了的那几场看来,当面试官觉得项目或者其他个人经历没有亮点的时候,就会主要考察科班的基础知识。网络和操作系统则是最关注的两个点。面试官有时候为了考察面试者的潜力,会问的很深,所以需要吃透相关知识。后两门可能有些大厂为了更加高效的刷人会问,问的难度也不会太高。
  3. 我一直在研究在基础不足的情况下如何写出更有亮点的简历,有几点心得:保证写在简历上的东西和一定要和面试的岗位有关;一定要突出项目获得的成绩和难点;项目的相关技术知识点一定要烂熟于心;在保证干货的情况下尽量缩减字数。
  4. 我认为,如果能熟练掌握项目相关的技术点做到怎么问都问不倒的时候,会极大提升面试官的评价,而如果被问得左支右绌无法招架的话,可能离面试挂掉也不远了。
  5. 心态非常重要!没有好的心态就会出现笔试都过,面试全挂的情况。出现这样的问题时不要一门心思盯着大厂,很多小公司或传统软件企业的校内宣讲会都是锻炼心态的好机会。大厂被刷心态很容易崩,最后自暴自弃。而小公司或传统软件企业不仅难度低,而且主场优势心态也更平和。在0offer的时候,拿到一个offer心里也会更有底气。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值