我所经历的Android面试

概述

笔者是非计算机专业,15年毕业一直在小公司,觉得完全靠自学已经到了自己的天花板,然后想进大型互联网公司发展,所以年前辞职,放弃了年终奖,年后就直接来的北京,面试的公司有稳定的大公司,也有创业型公司,有些创业型的公司面试质量也挺高的,不输于一些大公司,下面会说到。

PS :有兴趣的加入Android工程师交流QQ群:752016839 主要针对Android开发人员提升自己,突破瓶颈,相信你来学习,会有提升和收获。

技术储备

基础

不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。

算法

基本上每家公司都会有算法题,我当时是看了左程云的《程序员代码面试指南》,重点看了数组跟链表,二叉树没有去刷算法题,对于二叉树的掌握在于三种基本的遍历以及在排序算法中堆排序中用到的二叉堆,然后每道算法题都先自己去实现,先写思路,然后自己去实现一遍,然后再看看答案,记住答案的思路,第二天再重新按照答案的思路实现一遍,这种效果非常好,我没有去刷很多题目,而是想通过这种方式去分析常见的算法题,所以我不大建议去刷算法题,首先作为客户端开发,涉及不到很多的算法,第二,面试的时候考的算法大部分都是很基本的数组组跟链表构成的,最后算法这个东西是个无底洞,个人觉得没必要去刷题,刷题可能对小公司有用,但是大公司更看重你解决问题的能力。

虚拟机

  • JVM

对于Java,加载的是Class文件,一般会问到Java运行时的内存分配,类加载机制以及GC,实际上后面两个问地比较多,尤其是GC相关,往往结合四种引用出题,最后会通过这个来引出内存泄露相关的一些问题。

  • DVM&ART

Android的虚拟就DVM以及ART是对JVM做了一些优化,加载的是dex文件,对Class字节码做了一些优化,这个里面其实挺复杂的,我只知道一些基本的概念。

  • ClassLoader

这个其实要是问起来其实是有很多东西的,如果是Java相关其实还好,会问你类加载机制,但是Android里面除了Java的类加载机制之外,还会引出插件化跟热修复。

JNI

基本上稍微大点的公司都会问到,不过我的回答始终如一:我只能看懂C的代码,项目中没有用过JNI,当然这个属于加分项,因为我当时的选择是把我用过熟悉的东西研究地滚瓜烂熟,而不是在自己平时很少接触到的东西上面搞个一知半解。

Binder

Binder系列,各种AMS,WMS,PWS,常问到的有APP的启动流程,然后两个Activity相互跳转的时候的生命周期,Activity的生命周期。

心态

不要想着什么都会,那样不现实,比如说我对Binder机制以及热修复,插件化这块儿确实了解地比较浅显,也跟高德,爱奇艺等公司的面试官聊过这个话题,这些属于加分项,不会影响到最终的面试结果,还有就是算法,面试最多考一道或者两道算法,所以没必要在这方面花太多的时间,掌握好常见的数组跟链表,二叉树/堆了解一下,基本就够了,公司看重的是你解决问题的能力,你把原理掌握好,常见地基本上都没什么问题。

当你基础知识OK,自己用过的东西的理解地有深度,解决问题的能力OK,如果面试官想要你,那么他会去找你的优点,反之他会去找你的缺点。所以如果你想进某家公司,那么你就按照他们的要求去面,就算面不上那么也没什么,只能说不合适,然后查漏补缺继续面,不要因为某一次或者几次的不顺就否定自己,有些公司的面试官就是喜欢装,而且还是大公司的。

学历很重要,我的学校只是个普通一本,相对一般,所以投了很多知名互联网公司简历都过不了,就连好大夫在邀请我面试的时候特意问了我是不是统招一本,任何行业都看重学历,不仅仅是IT,那些说学历不重要的基本上都是一些学历比较好的或者是在Android比较火地那个阶段开始搞地Android,他们这批人往往会觉得在03年跟18年加入的阿里的难度是一样的,那些觉得学历不重要的可以去看看张雪峰老在《演说家》中的演讲,不要说什么3年以后公司就不看学历了,学历是一辈子的事情,那些高考能够碾压你的人,出了社会只要他们愿意,照样能碾压你,你努力,你拼命,别人也不会睡大觉等你。

科班很重要,如果你本科学地是非计算机专业,任何一个面试官或者HR都会认为你基础不行,你需要花很多的时间去精力去补基础,然后再花时间跟精力在HR不Pass掉你简历的情况下摘掉基础不行这顶帽子。

工作背景很重要,如果你有大公司背景给你背书,相同的岗位,你进入的门槛比有大公司背景的人要高地多,如果你有大公司背景,不管是面试官还是HR都会在你面试前给你打一个较高的基本分,这个是很有利于你通过面试的。

不过上面都是既定的事实,你没法改变,所以当我意识到这些问题的时候,我只能去不断地提升自己的能力,去花更多地代价去获得一个面试机会,去证明自己的能力进而进入到一个比较好的平台。

面试公司

火币网(Offer)

面试机会来自于V2EX

  • 一面:
  1. 如何开启多进程?应用是否可以开启N个进程?
  2. Activity的启动模式、任务栈以及使用场景?
  3. Volley能否进行数据量很大的请求,比如说加载100M的图片?
  4. 手写快速排序
  5. Volley的优缺点
  6. final修饰一个对象,能否调用对象修改属性的方法
  7. 子线程中如何使用Handler
  8. 如何进行单元测试,如何保证APP稳定。

面试官是Android的负责人,比较有亲和力,看起来比较幽默,,然后先从我的笔试题开始聊,聊地最多的是进程,他问我应用能不能一上来能不能开多个进程保活,对于这个问题我知道肯定是不能的,因为自己平时确实没有在项目中开多个进程,然后面试官态度很好地分析了下说,因为多进程首先会有多个Application,数据会被初始化多次,其次进程间通信比较麻烦,还有一个就是每个进程有单独的虚拟机,多个进程就会比较占内存,确实是这样,这些我有些印象,但是平时确实没有认真思考过这些问题,然后问我有没有用过Binder,我说只是写过几个Demo,然后面试官就说这个就不问了,就开始聊一些我简历上以及我会的东西,比如说Volley的优缺点,然后提出了一个问题说Volley能否下载电影以及加载大图片,我当时根据我看的源码说可以,因为Volley本身是不支持下载的,需要自定义Request才能实现这个功能,然后如果是读流到磁盘是没问题的,他说不行因为Volley是在内存中进行操作的,我当时跟他争了下,我说Volley原生不支持下载功能,只能自定义Request,包括上传也是需要自定义的,然后他感觉我有些不快,说读流确实是可以,但是ImageRequest去加载大图片的时候,也是在内存中读取的,这个时候就会有问题。不过我想了下确实是这样,这样的话确实会出现OOM,接着面试官就问了一个基础的问题,比如说final一般怎么用,final修饰对象的话能够调用修改属性方法等,最后让我写了个快排。

  • 二面:
  1. TabLayout如何设置指示器的宽度包裹内容?
  2. 公差为1的等差数列求和,如何优化
  3. 自己的优势在哪里
  4. 注解如何获取,反射为何耗性能?
  5. Java的GC机制,分代回收策略
  6. Binder机制:ServiceManager什么时候注册的?
  7. int,long的取值范围以及BigDecimal,数值越界了如何处理?
  8. ConcurrentHashMap的原理,分的段数是多少?
  9. APP是如何适配的?
  10. Android中如何查看一个对象的回收情况?
  11. 最大一次线上Bug处理措施

面试官问的Java偏多一下,同时也问地很深很细,关于Binder问到了一个问题就是SM是什么时候注册的,这个完问题我完全是懵逼的,然后给我出了一个算法题,就是公差为1的等差数列求和,当时我用了一个很笨的方法,就是用递归实现的,因为当时面试官不是直接说的等差数列,说的是如果输入0,返回0,如果输入1,返回1,如果大于1就依次累加,之前思维定势了,没有想到这是个等差数列,然后面试官问我能不能优化,我当时想到了高斯,然后把首尾相加,做了一步优化,后来实在是感觉没法优化了,面试官给我写出了那个等差数列的前n项和,不过当时面试官给我出了这个题目,返回值是int,我当时注意到int可能会越界,然后说应该返回long,估计是这个细节可能打动了面试官,然后我们就从int,long,到String,double以及BigDecimal,说了很多,因为之前在项目中计算价格的时候确实出现过精度丢失的情况,所以我对这块很熟,所以也聊了很多,聊到屏幕适配,ConcurrentHashMap所分的段数,最后问了我最大的一次线上Bug是如何解决的,还有在Android中如何查看一个对象的回收情况,那个确实不知道,后来想想应该通过Refer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值