前言
首先,自我介绍一下,我来自广东某工业大学的大四学生,本科专业是通信工程。大二开始自学Android相关,断断续续地看书,做项目,直到真正找公司发现始终还是一个渣渣。
后面自从今年(2017)8月中旬在实习的公司离职之后,一直在忙复习基础,找工作,所以很多事情都搁置了。后面发现好久没写过文章了,并在秋招中有一些个人的感受,因此想记录下秋招的一些有趣的公司的面试,大神们请轻喷哈。
阿里笔试批
以下都是阿里系统的视频面试
一面北京优酷
1.onStart和onResume区别
2.activity, view,window区别
3.点击按钮的事件传递过程,view的事件分发
4.view的绘制过程
5.handler机制
6.项目
先介绍项目,负责哪块,难点,解决方式
以下是面试官提及到的一些问题
- 框架源码
网络库比较,Glide和UIL区别,优势缺点等等 - 空指针,oom(MAT原理),anr(trace文件查看原因),出现的原因以及如何处理
- 屏幕适配(同一个apk,一套720*1280图片,如何适配多台手机)
7.情景
- 视频平缓屏幕放大变横屏功能如何实现
- 团队开发等等,只选择杭州吗,项目角色,对团队的向往
二面北京支付宝
讲项目
1.设计今日头条首页有图片又有视频的列表
2.设计手机通信录,如何通过输入名字快速查找到号码
3.一个非常简单的问题作为结束:数组链表区别
hr面
阿里的hr可是懂技术的,问的问题相对多,比如手机淘宝,手机京东的技术上有什么区别等等,大概40+分钟。
这是再加上我春招找实习阿里的面试经历。
首先谢谢助班还有助班的朋友,帮我内推了手机淘宝技术部,其中还提了很多宝贵的建议。如果下次还有阿里的内推,我建议大家还是早点内推,越早内推简历基本不刷,后面就开始刷简历了。
在网上完成的测评之后还有一道编程题之后(目测还是动态规划)一个星期之后接到一面电话:
一面(57分钟)
1.项目源码(Eventbus),数据结构(数组链表区别)
算法(快排怎么实现,两个字符串最长的公共子序列(动态规划)
2.Java基础(抽象类和接口区别,static类,sychronized,==和equal区别,try,catch,finally)
3.JVM(内存泄漏,类加载,双亲委派模型)
4.安卓的(activity的生命周期,自定义view,
view事件分发,handler机制,内存泄露,apk的生成原理和过程)
5.网络(http如何请问和返回数据,从请求到解释等等)
以上基本90%能答上来,其间我还提及到了C++方面和Java对比的(析构函数,多继承等等)所以很愉快地过了一面,问的问题比较广,基本把我学的都问了个遍,后面提问环节才知道他就是内推我的那个人。 真的很幸运,后面邮件他也提了一些建议,“小伙子要稳重谦逊点等等,哪个方面要加强等等”。真的谢谢他!
刚好又过了一周接到了2面电话,是一个非常有经验的面试官。
二面(56分钟)
1.项目(listview和recyclerview区别、说到listview没有itemType的时候,面试官说真的没有嘛?其实我已经说错了。所以面试出了一题如何实现listview的itemType、
不同item布局如何避免擦除tag(面试官提醒有没其他setTag的重写方法,我说用sp保存tag,面试官还算满意)、OkHttp源码(请求方法、请求报文和响应报文的结构。状态码300-400-500,keep-alive哪个http版本引入(我答了1.0,很模糊。其实是版本1.1),所以面试官叫我解释一下长连接)
图片缓存库(由于我说到源码的弱引用的时候所以面试问了我虚引用场景)、支付sdk 、Activity的启动模式,任务栈的管理(面试官一直引导我由哪个管理的,估计面试官想我答AMS,ActivityTask相关的,没答出来)
listview的tag问题:
http://blog.csdn.net/zhuangxiaozhi/article/details/66551453
2.handler机制、内存泄漏(对象的创建,生命周期的长短关系)、threadocal源码(由于我忘记了,所以面试官又问叫我如何实现一个threadlocal场景)、于是我说了互斥锁的场景,后面发现自己已经挖坑了,所以面试官接着问锁的类型区别(对象锁和类锁)、可重入锁,死锁怎么产生,如何避免死锁(银行家算法)
3.进程线程区别、进程的通信方式、Binder的区别和操作系统的进程间通信方式优势
4.垃圾回收机制、判断对象可回收的算法以及源码理解(又是问源码,JVM哪里来的源码看呢?)
这次真的是问得好深,很多问题都是刨根问底,感觉准备得还是不够充足,还有答错的,基本60%能打出来。
后面过了一个月之后,内推的人查到挂第二面了,已经没有技术面了,一次很接近hr的机会就丢失了。
阿里的面试官真的挺有水平的。
总结就是有时候面试官不一定要你回答问题,而是看你的思考方式,还有自己了解的深度。还有遇到不懂要自信点,并且学会转移话题。
腾讯笔试批
一面mig手机管家
1.手写快速,c语言版本实现,快排的优化,时间复杂度,nlogn的其他排序以及对比
2.项目,当时项目总结得不是很好,自己进了一个大坑。所以建议自己的项目一定要总结好。Lv和Rv区别
3.提问
二面
计算机组成原理,gg。
这是再加上我春招找实习腾讯的面试经历。
内推一面(17分钟)
师兄的内推,真的很感谢他。 据说腾讯的内推是刷简历的,当时觉得就没多大机会,很多事情想想都是猝不及防的。嗯,腾讯其实才是我最早应该面试的公司,但是和舍友投了久邦数码之后,不知为什么有两个来自深圳的未知电话(上面写着腾讯公司),后来打回去是客机,之后一个星期都没打来了(已经打算放弃了)。有一天晚上做完笔试,不知为何又有深圳的电话打来,一想便知是腾讯的。后来面试完,查找通话记录发现,后面的一周内面试官原来打了我不少于10次的电话。
是个女面试官,感觉是简历面,(好像是拿着题库来问我)
1.项目负责哪一部分,性能上有什么优化?
2.图片的缓存,ANR ,内存泄漏
3.自定义View
4.四大组件的生命周期
5.数据的持久化保存方式
基本能答出来,后面还是没过。(应该内推的要求还是比较高吧)
正式招聘
笔试(4.2)
在线上完成的笔试,题目还是比较难的,涉及到c/c++的比较多,网络,操作系统,数据库,还有两三道Android,还有一题OC的。问答题是腾讯产品快报Fragment的功能设置,面向对象的三大特性,编程是有关单词的(没做出来),变形的二分查找。做完就很绝望啊,没想到某天晚上收到面试通知。
一面(4.12)
其实我也很绝望,当天下午EDA考试,还有两天的感冒在宿舍睡了两天。模模糊糊地看了下书啥都不想做,提前交了卷后,打开手机发现工作人员打了我8次电话,就急冲冲地赶到了酒店,下着雨,从地铁站坐了个滴滴到了酒店,已经5点多了,看起来还是好多人哇。(貌似挺多人来霸面的)
后面hr问谁在5点30分前预约面试还是没接到面试的上前面,后来我就解释了一下因为考试的原因,后面就在前排等着,后来收到微信的推送和短信通知,就进了某个房间开始了面试。
面试官先叫我做了个自我介绍,之后看着我简历写了熟悉Java,就问了比较多有关Java的。
Java:1.线程安全,锁的实现,以及各种线程同步方法的区别。四大引用,重载重写区别(我还涉及到JVM的动态分派和静态分派),hashmap源码(jdk1.8为什么要加入红黑树)和hashtable区别,stringBuilder,stringBuffer 区别
项目和Android:2.项目负责哪一块,图片缓存策略,广播的注册方式,动态注册在activity哪个方法注册,好处。数据的持久化存储方式(第二次问了)
3.手写单例模式(写多了一个同步锁,面试官发现了),随机存储0-99这些数到int[100]数组中,不能重复(写得不全,一直在想优化算法的问题,一开始还存在数组越界的问题,又被面试官发现了)
后面就是惯例问问题,我的问题问得比较傻,也可能是被刷的原因之一,所以建议各位同学事先好好准备几个问题。
后面问了面试官的建议以及评价
面试官最后的回答是:基础还算比较扎实,但是语言的表达(先理清思路再回答),腾讯这么大的公司算法也是要过关的。可能没给面试官留给心思缜密的印象,当晚面试从6点多面到7点多,当时大家还没吃饭,我是最后一个面试的。面完一个傻傻的站在酒店楼下发呆了一下。当时回到学校查了下微信显示“当前职位可能不适合您”。最终和腾讯就这样失之交臂。
富途证券
这是一家由腾讯控股的公司,感觉挺不错的。
一面,评价A
1.实习做的项目介绍各个技术点(要有自己亮点)
如界面卡顿(列表缓存优化), EventBus注意点
(混淆代码后注册方法被混淆了咋办,3.0加入APT注解工具)等等
2.Android:oom,内存泄露,http请求方法,get,post区别
- Java相关:
抽象类和接口区别(忘记已经多少次问了)
死锁,n个线程n个资源n个Lock,如何避免死锁
4.一个6升和5升的水壶,没刻度,如何得到3升水
5.交换变量,不能用中间变量,解决的原理
面试官人很好,交流的时候有提示
二面跟腾讯的套路很类似,评价B*+
1.上来就把做对做错的题问一下,还有笔试的sql语句不会写,继续写,还是错
2.变形二分查找(本人笔试字体丑),继续写
3.马铃薯,买和卖各一天,100天,求最大利益
其实就是股票的买卖最大利益
4.100瓶药水,有且只有一瓶毒药水,老鼠喝了7天才有反应。问至少多少只老鼠才能找出那瓶毒药水
CVTE提前批
一面
都是面完一个面完上一个。没有顺序,两个面试官,看样子都是搞Android的
1.我项目中的一个写到了推送的TCP心跳包,就细问了一下原理(如何保证后台进程不被kill等等)
2.线程启动的方法(三个)
3.软引用、弱引用区别,见我回答得比较快又爽,就问了下虚引用的引用场景等等
4.Activity的四种启动模式
5.Handler机制
6.HashMap源码
7.MVP,MVC,MVVM区别,用图画出来
8.Java垃圾回收 --babalala
9.泛型
10.锁(sychronized/look&&reentrantlock)
11.手写算法:找出字符串第一个只出现一次的字符,秒了。讲了下思路
12.讲下RxJava的flatMap的原理
13.面试官说没什么问了,就多问一下多线程的知识--如何结束线程(当时忘了就讲了一个不常用的stop)
14.怎么学习Android,有没写博客(多少篇),有没开源(多少个star)
15.有没学习新的语言,原来面试官是想知道有没学Kotlin
可能有些是忘记了,但是基本按照自己知道的全部都说了,然后面试官叫我到那边坐着等一下先,所以知道一面是过了
二面
等了一会,很快就有人叫我上去二面了。面试官是一个年轻的小伙子
1.首先他一上来就问了一个算法,据说是经常经常问的一个:1 11 111 1111 。。。2017个1,求输出
我没问输入是什么,然后他就问我输入你都不知道是什么就开始写了,整个过程一直被压着。他说n是2017,然后我就开始写了,5分钟没写完。然后他问我写完没,再给了2分钟。后面基本讲了下思路吧。那时候感觉就不好了,有种压力面的感觉。
2.后来他说这个先这样吧,说先问问网络吧,HTTP是哪层协议(应用层),说到了基于TCP,然后他问了我如何UDP模仿TCP安全传输,然后我就说了下ack序列号滑动窗口等等。有些可能是跑偏了,然后他又说我跑偏了,那时候真的想直接回去了GG。这个问题上扯了好长时间,好像没令他满意。就问了一下数据怎么安全性,我说了加密,还有ca证书等等。这个时候已经感觉自己跪了。
3.说到了内存溢出,图片的JPG和PNG区别,还有5.0加入的SVG,图片大小如何计算,图片如何压缩,算法
4.然后就问我看过了什么源代码,我说了一下设计模式相关的看得多(他们比较喜欢问设计模式),然后说到了属性动画原理是反射,然后就问反射的缺点(忘了),再说到了代理模式,就问了下静态代理和动态代理区别。我也忘了。
5.问我如果接到一个项目,你会从哪个方面考虑,从代码方面讲述,还有性能方面等等,后面他又说我跑题了。我整个人都不好了。
6.最后他说他了解得差不多了。问了一下对自己的表现评价,我说我秋招再来吧,面的不好。然后就问了下公司的情况知道吗,有没有觉得刚才你觉得你优势的地方我没有问出来的等等。
7.知道自己跪了,就礼貌地跟他握了个手,他笑了一下,他说他也是我们学校毕业的。
终面
因为面得不好,所以问HR是否能回去了,没想到HR跟我说还有一面,心里想,这也能过。后面就是两个HR对三个人
1.家庭成员
2.职业规划
3.以后想工作的城市
4.想加入的公司
5.对自己影响最大的一个人
6.理想薪酬
7.学习成绩
8.压力最大的时间
9.对提前批的看法
10.有无其他公司offer
11.什么行为是自己不能接受的
12.对加班的看法
13.父母对自己的期待
美团深圳一面,霸面挂
1.Java:
HashMap的底层和HashMap的hash算法
volatile的含义,使用场景,线程yield的作用
2.垃圾回收机制,有多少能说多少
3.网络,OkHttp底层源码,请求队列具体到是一种怎么的队列,画一下请求包结构,请求头有哪些常用字段,如何加快网络的加载速度,从客户端,服务器方面,代码优化方面等
4.Android:
内存泄漏场景,Handler机制,循环消息是执行在哪里的线程?如果没有消息,它是一种怎么样的情景
ListView可以优化的地方
apk瘦身
如何让app启动加快,(冷启动),
插件化原理,hook原理
点击图标Launcher进程启动另外一个进程的过程,binder相关的,比如client是如何向servermanager注册binder的,能说多少就说多少。
activity的启动模式和引用场景
Android如何保持service不给skill掉?有哪几种进程?优先级从高到低。
加载图片列表的优化,oom问题如何避免,bitmap相关等
viewstub作用
RxJava使用的优势
MVC,MVP,MVVM画图解释区别优劣势
5.假设有一个最大线程数是5的线程池,当加入6个任务的时候,你是如何设计解决这样一种场景
6.手写判断链表有环
至此,当时找到还算不错的工作就不想再折腾了,所以美团毫不犹豫地挂了。但是美团的面试体验是非常友好的,为hr和面试官点赞。
至于我去哪里,就保密吧哈哈。
手写算法常见
1.链表:插入,删除,反转,判断单链表是否有环
2.排序:快排,归并,堆排,比如第k大的数
3.实现一些常见的数据结构,比如栈等
4.字符串的处理,特别是第一次只出现一次等情况的字符查找。
秋招的一些体会
上面只是记录了一些觉得参考价值较大的面试,就可以体现出Android开发在校招的一些要求。可以得出以下一些个人的总结:
1.数据结构和算法基础,特别是大公司的笔试或者面试都可以体现出来
网络:TCP/HTTP,设计模式,Java基础,Android基础都是需要非常扎实的。
2.项目,一定需要有自己的深度和亮点。至于实习经历那块,最好是有大厂的实习经历,这样可以通过很多公司的简历筛选。
3.再说说一些软实力,比如语言的表达能力,后面多参加几个公司的面试就培养起来了,一开始我也不是特别好,后面面多了就成精了。
4.心态,不要因为一次的失败而气馁,也不要因为一次的成功而骄傲。面试存在着一定的运气成分,找工作是双选选择。
5.最后,Android的需求确实趋于稳定了,对于Android开发人员的要求越来越高,很多需要透过源码的本质去分析,所以平时更需要严格地要求自己。
以下是个人看过的一些书籍
1.有关C/C++:
C primer第五版:http://product.dangdang.com/8976834.html
C程序设计语言第二版(至今都未更新,大神出的书):
http://product.dangdang.com/8766529.html
- C++primer第四版:
http://product.dangdang.com/9157098.html
- 数据结构和算法
- 数据结构和算法分析(C语言描述)
http://product.dangdang.com/8767364.html
(个人认为最好能表达出数据结构的精华就只有C/C++)
- 算法(第4版)【Sedgewick之巨著,与高德纳TAOCP一脉相承】:
http://product.dangdang.com/22880871.html
- 有关Java和虚拟机:
- Java编程思想(第4版)
http://product.dangdang.com/9317290.html
(后来看不下去了,太多,代码和字太密)
- Effective Java中文版(第2版):
http://product.dangdang.com/20459091.html
(很多人都说它是本好书,你觉得呢)
- Java并发编程实战
http://product.dangdang.com/22606835.html
- Java核心技术 卷1 基础知识(原书第9版)
(师兄送了卷1和卷2,我只看了卷1->>>英文版,推荐)
- 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
http://product.dangdang.com/23259731.html
- 有关安卓:
第一行代码第一版(去年12月出的第二版),Android编程入门经典(高级编程还没看),Android开发艺术探索,Android 源码设计模式解析与实战 。
- 有关操作系统:操作系统精髓与设计原理
http://product.dangdang.com/20919066.html
其实更推荐深入理解操作系统那本书。
最后的,有需要Android面经总结的,可以在下面留个邮箱,看到的一定会回复。