我所经历的Android面试

概述

笔者15年毕业一直在小公司,以为彻底靠自学已经到了本身的天花板,而后想进大型互联网公司发展,因此年前辞职,放弃了年终奖,年后就直接来的北京,面试的公司有稳定的大公司,也有创业型公司,有些创业型的公司面试质量也挺高的,不输于一些大公司,下面会说到。前端

技术储备

基础

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

算法

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

虚拟机

  • JVM

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

  • 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都会在你面试前给你打一个较高的基本分,这个是颇有利于你经过面试的。

不过上面都是既定的事实,你无法改变,因此当我意识到这些问题的时候,我只能去不断地提高本身的能力,去花更多地代价去得到一个面试机会,去证实本身的能力进而进入到一个比较好的平台。

面试公司

火币网

面试机会来自于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中如何查看一个对象的回收状况,那个确实不知道,后来想一想应该经过ReferenceQueue能观察到,由于平时没有想过这个问题,因此被问到的时候很容易懵逼,不过总体表现还能够。

  • 三面:
  1. APK的大小如何压缩
  2. APP的崩溃率,多渠道包
  3. 本身作过的APP用户量
  4. 可否接受加班

面试官是火币的大前端负责人,问了我一些项目开发流程上的东西,相似APK的大小如何进行压缩,如何查看APP的崩溃率,以及多渠道包,而后聊了下薪资以及可否加班等,大部分都是一些非技术性的问题,次日火币网就给我Offer了,虽而后来我没有去这家公司,仍是挺感谢这家公司的,给我后续的面试增长了不少信心。

蛋壳公寓

面试机会来自于拉勾网

  • 一面:
  1. MVP如何管理Presenter的生命周期,什么时候取消网络请求
  2. 用过的框架及原理
  3. 天猫的Tangram布局,vLayout原理

面试官是是Android的负责人,主要是在聊本身作过的东西,而后发现咱们不少技术上的观点都是相同的,好比说咱们都认为任何一个框架两三句话均可以把原理说清楚,可是真正本身去实现的时候每每比这个复杂的多,我告诉他我在本身写图片加载框架的时候踩过的坑,而后面试官也说了他在使用MVP的过程当中遇到的管理Presenter的生命周期过程当中的探索,由于以前个人一个项目采用的是MVC,当时是用的RxLifecycle进行管理的生命周期,在MVP中我是在BaseActivity中统一把请求取消掉了,而后他说了他的解决方式,确实颇有探索精神,我也学到了不少东西,最后简单说了天猫的七巧板布局,大部分仍是在聊项目中的一些细节。

  • 二面:
  1. APP的启动流程
  2. 回形打印二维数组
  3. Java为什么引入泛型,泛型边界
  4. 常见的Java数据结构
  5. ArrayMap跟SparseArray在HashMap上面的改进
  6. Java的四种引用及使用场景
  7. Webview性能优化

面试官是移动端负责人,而后问了我APP的启动流程,这个我说我没怎么深刻研究过,面试官也没说啥,而后继续问了一些Java基础,Java引入泛型的缘由,泛型边界,集合框架,最后问到了SparseArray以及ArrayMap。最后说到了内存回收,而后带出了GC以及四种引用,因为他们的项目中不少地方用到了WebView,因此他问了一些WebView的跟JS进行交互的问题,最后还聊到了WebView的性能优化,感受面试官确实对WebView比较了解,不过我也以为没什么,毕竟这块不是我擅长的地方,面试官也表示理解,而后最后出了一道算法题就是回形打印二维数组,总体来说他们其实仍是侧重于项目,也考察了基础,总体感受他们的技术仍是很好的。

GrowingIO

面试机会来自于Android Weekly

  • 一面
  1. Binder机制
  2. ClassLoader的理解
  3. Arouter的原理
  4. 组件化原理,组件化中路由的实现
  5. 热修复跟插件化的原理
  6. 线程池的几个参数的理解,四种线程池的使用场景
  7. 经常使用的设计模式,手写DCL单例模式
  8. 进程间为何不能直接进行通讯
  9. 应用跟系统之间通讯何时用Socket何时用Binder

面试官问地都是Android底层的东西,有些还涉及到了Android的Hook插桩技术,面试完,我以为本身跟只傻狗同样,什么都不会,问了有10来个问题,惟一的两个应用层的问题因为紧张也没有答好,一个是线程池原理,一个是DCL单例少写了个非空判断,其他的问题真的是答地很水,由于前面的底层知识了回答地很很差,因此对本身应用层的发挥确实是有影响的,因此但愿你们在面试的时候心态必定要平和,切记没关系张。因为他们项目在底层采用了不少关于IPC之间的东西,因此基本上须要对底层很了解的工程师,我本身也感受确实回答地力不从心,并且我是给他们CTO直接发的简历,忽然间以为很差意思,回答地挺垃圾的。

  • 二面

面试官是作IOS的,基本上是处于聊天的状态,反正聊地很开心的,而后对我评价很好,他说他不懂Android,可是能感觉到个人技术好奇心,听了仍是很开心的,反正基本上没怎么聊具体的技术,主要是聊了聊IOS的Hook以及热修复相关的技术,问他们是怎么实现的,由于我知道IOS在这个上面比Android要复杂一些,反正总体就是很放松。

  • 三面

三面是产品总监,基本上就是谈古论今了,让我说说对Android以及IOS的见解,我说谷歌将来确定会在人工智能上干掉IOS,而后他说为何,我说由于谷歌掌握了搜索的大数据,Android产品接入的成本低等等,而后我跟他说我但愿产品在设计原型的时候须要考虑一下Android跟IOS两个平台的差别,不能一刀切,他说是应该这样,可是有不少时候须要保持平台一致性就须要作一些妥协之类,最后其实还聊到了锤子,聊了聊对老罗以及锤子的见解,产品总监说锤子的发布会每场他都会看,而后他还给他家人买了一部坚果Pro,反正想着确定会挂掉,索性就不那么拘束了,就是一种很放松的状态。

  • 四面

四面是CTO面,当时有点紧张,CTO颇有绅士风度,一上来主动跟我握手,当时我有些紧张,手心都出汗了,他说我是否是很热,我说是的。而后说本身从网易出来以后就开始创业了,一直是在作提升企业生产效率相关的产品,如今作的GrowingIO也是的,而后问了我不少问题,主要是我在上一份工做中的成长跟收货,将来的规划等等,以及在项目中遇到问题是如何进行团队协做的,问地很细,能够看地出来公司对这款产品很是重视,像滴滴企业版,陌陌等都是他们的客户,感受这家公司会发展很不错,最后我也问他为何会尝试作那么多产品而不是专一于某一款产品等等,而后他也给了详细的解答。

没有给我Offer的缘由在于个人薪资可能开地太高,一面基本上是处于被淘汰的局面,可是我跟后面的面试官都聊地很好,晚上还在那儿吃了顿饭,最后CTO还跟我聊了好久,我以为他们应该是以为我能够培养,可是薪资要低偏高,因此就最终放弃了我,由于对于创业公司,个人薪资都开地高一些,无论结果怎么样,仍是挺感谢这家公司的,但愿他们发展地愈来愈好。

昆仑智启

面试机会来自于拉勾网

  • 一面:
  1. Debug跟Release的APK的区别
  2. 软引用跟弱引用的区别
  3. ConcurrentHashmap的原理
  4. Listview跟Recyclerview的区别(刷新,缓存,各自的使用场景)
  5. 对谷歌新推出的Room架构
  6. 动画的两种实现:setX跟setTranslationX区别
  7. 事件分发:Activity跟window依次到viewgroup
  8. Volley源码,优缺点
  9. Picasso传入的Activity跟Application的context的区别

一面仍是只要从简历上入手,而后问地相对来讲比较简单,面试官应该跟我年限差很少,更多地在于不少东西怎么去使用,比较侧重于一些细节,不过总体来讲表现地自我感受比较满意,由于基本上都是问我会哪些东西,而后从我会的角度出发,一步一步来进行深刻交流。

  • 二面
  1. 数据库的升级,表结构的修改
  2. 常见的排序算法,手写二分查找,二分查找的复杂度分析
  3. 点击APP图标启动APP的大体流程
  4. SplashActivity中进行初始化MainActivity的参数,Splash没有初始化,AMS直接启动了MainActivity怎么办
  5. 设计一个多线程,能够同时读,读的时候不能写,写的时候不能读(读写锁)
  6. 设计断点续传,如何判断服务端是否支持断点续传
  7. Binder机制:Binder内核所在的进程是如何找到到Server跟Client进行通讯的
  8. 对JNI是否了解
  9. 组件化的原理,组件间通讯

面试官看起来经验比较丰富,偏向于Java这一块,应该是从Java转的Android,看上面的问题其实就可以看出来,问到的Android颇有深度,一上来就搞了个APP的启动流程以及AMS,那个读写锁确实不会,以前没听过,当时是要我实现这个功能,我用了不少种方法去尝试,可是最终没有达到预期的效果,而后面试官就问我知不知道读写锁,我不知道,而后他就没有再深究了,虽然这是一家小公司,可是我能感觉到对一个非科班出身的程序员的尊重,再次表示感谢。

京东

面试机会来自于Boss直聘

京东到家(电面)
  1. GitHub上面的开源项目
  2. 一个线程可否建立多个Handler,Handler跟Looper之间的对应关系
  3. ArrayList跟HashMap是够线程安全,如何保证线程安全
  4. Volley返回数据量比较大的请求时怎么办
  5. ListView跟RecyclerView刷新数据原理,使用到的设计模式
  6. 适配如何作,有没有适配过全面屏
  7. Fragment跟Activity的通讯方式,你知道几种?

电话面试以后就挂掉了,第2个问题回答地不是很好,因为没试过一个线程能建立几个Handler,因此不太肯定,最后仍是对Handler机制了解地不够深入,别的基本上答地还能够,全面屏没适配过,最后就没联系我了。

京东商城(电面)
  1. 内存泄露的种类
  2. ActivityA启动ActivityB时生命周期的变化
  3. AMS是如何管理Activity的
  4. JVM中的GC回收机制
  5. 常见的跨进程通讯方式,AIDL的实现原理
  6. APP以及Activity的启动流程
  7. Hook以及插桩技术

联系个人是京东上海的部门,而后说他们主要是作底层的,因此问了一些底层的东西,第2个问题,我就以前没遇到过,而后Hook插桩这些,很显然不会,而后就凉凉了。

京东金融
  • 一面:
  1. 从长度为m的int数组中随机取出n个元素,每次取的元素都是以前未取过的,如何优化
  2. https是如何保证安全的,证书如何校验
  3. Android的签名机制,APK包含哪些东西
  4. 是否遇到过OOM,如何解决
  5. 是否作过逆向
  6. 对JNI了解多少
  7. 手写单例(DCL)
  8. 是否写过so文件
  9. 热修复原理,如何进行dex替换的

看面试题其实就能够发现,京东金融是偏向于安全这个领域的,最后面试官也跟我说,我进去以后会往移动安全工程师方向发展,最开始的那个算法,没答好,当时个人思路其实是打算取一个数组就把数组中的元素给置空,可是因为是int数组,因此无法置空,当时就在这儿想了一下子,而后面试官给出的答案是直接删掉这个元素就能够了,可是性能较差,若是考虑性能则能够直接跟尾部元素进行交换,而后下次随机的范围减1就能够了。剩余的问题答地其实还能够。

  • 二面:
  1. 简单说下项目
  2. 内存泄露,如何检测以及检测的原理
  3. 点击Launcher跟点击微信支付启动微信有什么区别
  4. 逆序一个字符串,不能调用String的reverse方法(考察编码风格)
  5. 组件化原理,模块化机制
  6. 没有给权限如何定位,特定机型定位失败,如何解决
  7. 同步跟异步机制(是业务上的,不知道他想问什么)
  8. 线程池中核心线程数跟最大线程数如何定义

二面的话问的问题比较常规,基本上跟以前的公司重合度较高,没有难度,主要比较注重应聘者解决问题的能力,特别是像那个权限适配,我以前作过权限适配,因此那个问题回答地他挺满意的。

完美世界

面试机会来自于拉勾

  • 一面:
  1. StringBuffer跟StringBuilder之间的区别
  2. 并发相关,各类锁
  3. View的绘制流程,事件分发
  4. Hashmap,Arraymap,SparseArray
  5. 四种引用
  6. MVP跟MVC的区别
  7. LV跟RV之间的区别
  8. Service相关,startService以及bindService
  9. Fragment不一样于Activity的生命周期
  10. 生产者消费者问题:一对多,多对多状况
  11. 常见的设计模式,并选择一种描述一下
  12. Scroller的使用

看过面试题可以知道,一面比较重基础,也是一些重复性很高的问题,不过完美的面试官可能比较注重细节,不少问题你只要平时思考过了基本上是OK的。

  • 二面:
  1. Gradle生命周期
  2. Java&Android关于Classloader源码解析
  3. Python的class文件
  4. DCL中Volatile的做用,如何防止反射实例化单例对象
  5. 抽象类可否实例化,理论依据是什么?
  6. 如何经过Gradle配置差别较大(20%差别)的多渠道包
  7. class文件如何转化成dex
  8. Service先start再bind如何关闭service,为何bindService能够跟Activity生命周期联动?
  9. JVM相关,DVM以及ART是如何进行优化的,具体步骤
  10. 长链接常见的库,短连接
  11. 静态同步锁与普通同步锁的区别
  12. 直接在Activity中建立一个thread跟在service中建立一个thread之间恩区别

二面的面试官是北大毕业的,问的问题都比较深刻,涉及到了不少Java跟Android的细节,后来才知道,他知道我基础还能够,之因此问到后面的那些问题是由于想给我定级,当我说我了解Gradle的时候,面试官问我是否了解Gradle的生命周期,当让我写一个DCL的时候,问我Volatile的做用是什么,如何防止单例被反射实例化,DVM&ART是如何对JVM进行优化的,Class文件如何转换成Dex文件,反正就是你会的确定会让你表达出来,你不会的你也无法装下去。

高德—汽车事业部

面试机会来自于Boss

  • 一面:
  1. View的生命周期
  2. View的绘制流程跟事件分发
  3. Activity跟Window之间的关系
  4. 对C跟JNI是否熟悉
  5. 热修复原理,插件化是如何进行加载插件的
  6. Java中的锁,各类同步方式之间的区别
  7. ANR在四大组件中的时间,场景
  8. OOM,如何避免
  9. 内存泄露原理,如何避免
  10. MVC跟MVP之间的区别
  11. ListView针对多种item的缓存是如何实现的
  12. Android绘制二维跟三维的View的区别
  13. 是否了解硬件加速
  14. ListView是如何实现对不一样type的item的管理的

面试官问了不少底层的实现场景,有深度也有广度,在跟他交流的时候,可以很明显地感受到本身在不少问题上没有作过太深刻的尝试,不过总体感受还能够,基本上本身的能力是彻底发挥出来了,不少问题他问地特别细,好比说ANR问题,问到了在四大组件中ANR的时间是多少,还有ListView的缓存对于多种Type是如何实现的,不少问题你只知道概念是没有什么用的,都须要本身的理解,不过像硬件加速这种问题,确实没有细想过,我也不会去细想,觉得以前在传统公司是不可能有时间跟精力了解这些东西的,只能说北京本身来晚了,可是来对了,当面试官知道我是第一次来北京的时候,还跟我开玩笑说会不会干几个月又跑了,最后一面面完以后还让我留了他的电话,说北京租房子挺贵的,要是有什么问题的话能够给他打电话,感动ing。

  • 二面:
  1. Android中IPC方式,各类方式优缺点,为何选择用Binder
  2. 主流的热修复框架流派,原理,是否研究过classloader源码
  3. Android为何要设计两种classloader,为何不用一种,经过type来区分
  4. Bundle传递数据为何须要序列化
  5. 手写一个快排,分析原理
  6. 广播传输的数据是否有限制,是多少,为何要限制?
  7. Activity启动时生命周期是如何回调的?
  8. MVP.MVC.MVVM之间对比分析
  9. 组件化通信:有几种通讯方式,Arouter原理
  10. 插件化加载流程,原理
  11. 关于反射混淆,耗性能的解决方式
  12. 天猫七巧板布局原理
  13. 热修复流派,原理

面试官的问题基本上是没有离开过Binder,热修复以及插件化,不过我确实,因为紧张,快排写地也出了点问题,心中千万头羊驼呼啸而过,尴尬地一比,当聊到组件化的时候,我以为这个是个人优点,而后说了一大堆本身经过反射的实现,而后他说反射会在混淆的时候出问题,还有就是性能上的问题,本身研究了那么久的东西,在他这里没有看到丝毫的价值,确实也比较失落,不过他们是作车机的,确实须要对底层掌握地比较熟练,想着十有八九是凉凉了。

高德—地图事业部

面试机会来自于Trinea内推

  • 一面:
  1. RecyclerView的itemdecoration如何处理点击事件
  2. 单例模式如何修改数据
  3. android事件传递,很是细
  4. 多线程

一面面试官可能比较忙,没有问太多的问题,主要聊了聊我GitHub上面的开源项目,当时这个聊了好久,而后说了他们项目中也采用了ItemDecoration的列表联动,而后就问了我如何处理ItemDecoration的多个点击,最后聊到了事件分发机制,主要是在ListView里面嵌套一个Button以及在ListView里面嵌套一个ScrollerView让我说一下事件在dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent中的传递过程,面试官先让我说,我只是说了大致流程,而后面试官又给详细地分析了一遍,分析地很是详细,确实让我受益不浅,本身对事件分发的理解又更加进了一步。

  • 二面:
  1. JVM内存分布,Classloader
  2. 静态代理跟动态代理
  3. 线程的生命周期
  4. 是否用过DataBinding
  5. 是否接触过JNI
  6. 对热修复跟插件化了解多少
  7. 对RN了解多少
  8. 二分查找
  9. 说下多态
  10. 编译期注解跟运行时注解
  11. 线程跟进程间通讯
  12. Android中的IPC
  13. java中的传递
  14. equals跟==
  15. Picasso的存储
  16. 项目中的难点
  17. 项目中用到了哪些第三方
  18. MVC,MVVM,Clean架构
  19. 抽象类跟接口的区别,接口的默认修饰符

二面面试官问了不少基础方面的东西,问地特别细,主要是考察Java基础,感受面试官是想跟我探讨一下比较新的技术框架 的,可是像DataBinding以及Glide这些我都没有用过,因此就问了我不少基础的知识,总体感受还能够,确实有些基础没有掌握好,深度也有些欠缺

掌阅科技

面试机会来自于Boss

  • 一面
  1. Canvas.save()跟Canvas.restore()的调用时机
  2. 程序A可否接收到程序B的广播?接入微信支付的时候,微信是如何跟当前程序进行通讯?
  3. 对Java.nio了解多少
  4. ConcurrentHashMap是如何实现分段锁?
  5. 如今须要遍历SD卡下全部的文件打印出后缀名为.txt文件名称,如何提升时间效率?
  6. 为何复写equals方法的同时须要复写hashcode方法,前者相同后者是否相同,反过来呢?为何?
  7. Android4.0~8.0之间大的变化,如何处理?
  8. 说一下Measurespec这个类
  9. ViewHolder有什么用?
  10. Gradle的Flavor可否配置sourceset?
  11. 线程池核心线程数通常定义多少,为何?
  12. Intentservice有什么用
  13. 弱引用何时被回收
  14. Android中提供了哪些类来帮忙处理线程
  15. http的状态码,常见的请求头,http缓存协议https如何加密
  16. 多进程的优缺点,多线程的优缺点
  17. 热修复如何修复资源文件?
  18. 有没有遇到64k问题,为何,如何解决?
  19. httpUrlconnection跟httpClient有什么区别

掌阅总体的面试质量比较高,可是面试官给个人感受有点过于自信,就像第5道算法题,我当时确实没有想到除了遍历以外该如何优化,而后面试官说能够开多个线程,我当时听了就以为很无语,可是他给出的理由是O(n)的算法不能优化,只能开多线程,我说即便不能优化,也是能够在O(n)的基础上进行加快的,好比说用遍历完一遍,作个缓存,作个标记,若是该目录下没有发生变化下次能够直接读缓存之类的,开多线程这种操做我我的认为确实算不上优化,最后这个问题不了了之。然后还有一个问题就是他说在复写equals方法的时候要复写hashcode方法,可是当时我说不必,若是是本身定义的一个类,只须要比对对象的惟一属性,好比说定义一个学生对象,我只须要判断学生的ID是否相等就好了,也就是只须要复写equals方法,不必复写hashcode方法而后场面又很尴尬,我后来想了下可能他想表达的是在集合类中存储的对象必需要同时复写equals跟hashcode方法感应该是说地过去的,可是当时没有这个前提,我以为在复写equals方法的时候不必定要复写hashcode方法,加上前面的那个算法题,可能本身当时情绪也不是很好,因此沟通上确实出现了一些问题。 我记得掌阅是在Boss上面进行投递的,当时是跟掌阅科技的移动端负责人黄剑进行沟通的,其实最开始知道黄剑是在跟包建强老师一块儿作一个自定义的ListView的时候,那个时候在性能优化的时候在还在同一个微信群里面请教过他问题,因此对掌阅的印象其实挺好的,可是此次面试确实体验不是很好。

马蜂窝

面试机会来自于Boss

  • 一面:
  1. 两个非基本数据类型数组: array1=[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,×11] array2=[x6,x3,x10,x5] 计算结果:[x6,x7,x8,x9,x1,x2,x3,x4,x10,x11,x5],写出你的算法
  2. 类的初始化过程
  3. 点击事件穿透原则
  4. 线程池使用的是哪种,使用原则
  5. LeakedCanary原理
  6. LinerLayout跟RelativeLayout的绘制原理
  7. Android新版本的一些新特性6.0,7.0,8.0
  8. 类的初始化顺序依次是(静态变量、静态代码块)>(变量、代码块)>构造方法

一面面试官问地都是基础,可是有些有难度,好比说那个LinearLayout跟RelativeLayout相对布局,我当时只回答了LinearLayout须要测量一次,而RelativeLayout须要测量2次,而后若是只嵌套一层首选LinearLayout,若是多层须要使用RelativeLayout,可是当具体问到RelativeLayout两次都测量什么的时候我没答上来。还有那个算法题。最后实现了,用数组实现的,可是我感受应该是树,可是对树不熟悉,因此用的就是数组。

  • 二面:
  1. 看了看项目提了问题如何进行优化
  2. 如何实现马蜂窝中的一个动画效果
  3. 软键盘顶起布局
  4. 组件化通讯方案

二面感受有点没怎么发挥好,由于面试官首先问了问我GitHub上的开源项目,可是他找了几个问题,问我怎么优化,而后又在我项目里面发现了几个问题,问我怎么优化,很明显那些问题都是他是比较熟练的,并且都是自定义View相关以及性能优化方面的,最后又拿了马蜂窝APP里面的一个滑动动画问我如何实现,基本上都是在问自定义View,基本上二面就是问了这几个问题,每一个问题都扩展了不少,可是都是View相关的,没有涉及到其余的知识点,可能他们的对于自定义View这块要求比较高,同时也要兼顾到性能调优,总体来讲,自定义View确实不是个人强项,最后还聊到组件化,他们如今也在作组件化,我说了个人方案,貌似他不是很满意,最后也能感受到发挥地不行,因此被Pass掉了。 还有一个细节就是,一面面完,当时二面面试官不在,是次日过来复试的,次日来了签到以后又等了将分钟,而后他们说签到机坏了,当时感受挺很差的,不过当我二面的时候在那里等面试官的时候,马蜂窝的一个员工,年纪挺大了,而后看到个人访客牌,单独给我倒了一杯水,确实挺感动的,这个员工不是他们的接待人员,让我肃然起敬,而后他就继续上班了,总体发挥很通常,不过那儿的环境确实特别好,颇有风格。

爱奇艺

面试机会来自于拉勾

  • 一面:
  1. 聊聊RecyclerView,动画,缓存,数据绑定底层是如何实现的。
  2. 聊了聊个人开源项目实现原理
  3. View在屏幕中的移动底层是如何实现的
  4. Binder跟Socket之间的区别,何时用哪个,Binder的底层实现
  5. Activity,Window跟View之间的关系
  6. setContentView都干了啥
  7. Activity的启动模式
  8. MVC跟MVP之间的区别
  9. 算法:将一个有序数组去重获得一个新数组(空间复杂度为O(N))

爱奇艺确实要求比较高,面试题目难度特别大,让我说RV的时候,我说了不少,可是面试官感受都不太满意,而后问地特别细,涉及到了AMS跟WMS,这些问题我回答地通常,除此以外,都答地还能够,最后面试官说能够看出我有些东西研究地比较深,可是没有抓住关键点。

  • 二面:
  1. LruCache底层实现
  2. Hashmap的hash算法
  3. Bitmap在decode的时候申请的内存如何复用,释放时机
  4. 注解如何实现一个findViewById
  5. Android是如何学习的
  6. sycronized关键字的类锁对象锁,如何保证线程安全?
  7. 重入锁跟sycronized关键字之间的区别
  8. 除了notify还有什么别的方式能够唤醒线程
  9. 说说你对Context的理解

二面感受比一面要简单一些,可是也有几个问题我没答上来,当面试官说如何在Bitmap解码的时候复用申请的内存,我也是第一次知道原来这里能够复用,而后我提出了本身的疑问,说若是复用的话,那么何时回收,他说fresco有本身的回收机制。最后还有Context的理解,我只是看过郭霖的博客,有点影响,确实想不起来了,也是有些尴尬,包括那个用注解实现一个findviewbyid,也是有看过,可是没有完整的思路,最后支支吾吾地回答了一点,除此以外,别的还好。

  • 三面:
  1. Listview的adapter是什么adapter,如何复用。
  2. RV是如何布局的
  3. 算法:如何从1T的无序数组(长度为n)里面找出前k大的数据,复杂度要求为O(logN)
  4. 由A启动BActivity,A为栈内复用模式,B为标准模式,而后再次启动A或者杀死B,说说A,B的生命周期变化,为何

三面面试官应该是技术总监,第一个问题就把我难到了,我凭感受说是BaseAdapter,可是转念一想,不对,ListView还支持ArrayAdapter, 而后面试官笑着说让我回去看看源码,接着问了RecyclerView如何绘制的,我当时说了比较多,可是都没说到点子上去,面试官最后给我耐心地分析了下。给我印象最深的是那个算法题,面试官开始问我有没有搞过ACM我说没有,而后他就说看你不是非科班的,就出个简单点的,而后出了两道算法题,一题是实现一个链表,另一个是写一个快排,可是我感受面试官对非科班的有些偏见,而后我就说这个太简单了,我说你就把我当作科班的,而后说我但愿可以跟科班的作同样的题目(后来想一想本身有点飘),而后面试官就出了上面那道算法题, 我一看到O(lgn),感受凉凉了,想着快排最多也是O(nlgn) ,因此当时想了好久,也没实现,而后面试官给了我提示,说知道快排原理么,而后我在脑子里面过了一遍快排,忽然想到了解决思路,而后跟面试官说了个人想法,就是用改良的快排,他微笑着表示承认,而后最后说如何去找到标定元素,我说用随机数,他说随机数不太好,而后问了我数学怎么样,我说还行,他说能够采用正太分布,找到线性分布的那个中间点,确实是能够这样,由于没有规律的数据是能够看作正态分布的,也就是符合线性回归的。

美团

面试机会来自于内推

1.APP启动流程 2.Webview内存泄露 3.组件间通讯,如何传递对象 4.Arouter原理 5.如何取消一个网络请求 6.两个activity之间来回切换的生命周期变化 7.进程间如何通讯,Binder机制 8.内存泄露及优化 9.自定义view以及事件冲突 10.线程池参数及定义,多线程是否必定会高效 11.电量优化

美团实际上面了三面,可是面试题跟前面的面试官不少重复的,因此就只写了上面几道题目,总体面试感受都答上来了,可是问的有些问题确实没接触过,好比说Webview的性能优化,电量优化等,最后HR反馈的状况是基础很好,项目经验不足。

猎豹移动

面试机会来自于Boss

  • 笔试
  1. 请例举Android中经常使用布局类型,并简述其用法以及排版效率
  2. 区别Animation和Animator的用法,概述其原理
  3. Thread,Looper,MessageQueue,Handler,Message每一个类的功能以及这些类之间的关系
  4. 如何加载NDK库?如何在jni中注册native函数,有几种注册方法?
  5. 操做系统中进程和线程有什么联系和区别?系统会在什么状况下会在用户态好内核态中切换。
  6. 若是一个APP里面有多进程存在,请列举你所知道的所有IPC方法
  7. 请画出MVC、MVP模式的差别
  8. 对于Android APP闪退,可能的缘由有哪些?请针对每种状况简述分析过程。

笔试题,我答地感受通常,由于我面试的是猎豹移动的Clean Master,因此偏底层一些,不过总体还好,并且笔试题在面试过程当中基本上不怎么问,只是作一个参考。

  • 一面:
  1. listview跟recyclerview之间的区别,而后上拉加载的时候分别应该如何处理
  2. 项目中用过哪些技术
  3. 同步普通方法跟static方法之间的区别
  4. 不用锁如何保证int自增安全
  5. 内存为何会发生泄露
  6. 作过的性能优化,原理
  7. DVK跟JVM之间的区别
  8. 有没有diss过产品经理
  9. 平时看什么书
  10. 为何学python
  11. 项目中用到过哪些技术
  12. 指望在项目中扮演什么样的角色

一面面试官主要是从宏观的角度上看待业务,产品,由于可能看了个人博客跟GitHub,对个人技术有一个大体的了解,而后问了一些基础的东西,就进入了二面。

  • 二面:
  1. Sycronized原理
  2. ReentrantLock原理
  3. 静态内部类为何能保证单例,JVM是如何实现的
  4. ART跟DVM作了哪些优化
  5. View是如何绘制到屏幕上的
  6. 写一个快排,有时间限制
  7. 二面面试官问地特别深,一上来就是各类原理 问了不少原理的原理,好比说Sycronized原理,View如何绘制到屏幕上去,这些对于我来讲确实比较难,而后还问到了AQS, CAS的底层实现,答地通常般,我基本上对于JMM的了解就是类锁对象锁,指令重排序等
  • 三面
  1. GitHub上的开源项目是如何实现的
  2. 将来的职业规划
  3. 遇到问题如何解决
  4. 为何没有本身搭建SS 三面是猎豹移动的产品总监,没有问技术上的问题,基本上如实回答就好了,没有那么多的套路,真诚便可。

摩拜

面试机会来自于拉勾

  • 笔试:

本身带电脑,他们提供一个接口,实现一个瀑布流,须要考虑动画,内存管理等,能够上网搜,限时90分钟 当时我去的时候出了个之外,HR给个人WiFi我无法连GitHub,当时想着用本身封装的ImageLoader,没想着直接用第三方,在使用RecyclerView的时候依赖也无法添加,因此最开始时间都浪费了,直到一面面试官下来,给我链接了他们的员工wifi,我才能添加依赖,尴尬的一比,不过到最后时间到了仍是没有实现预期的效果,面试官最后问我,我说了个人考虑,他说只是想看看我解决问题的能力,彻底能够用第三方,不必本身实现,不过对个人态度仍是表示承认的,而后开始一面。

  • 一面:
  1. 深拷贝浅拷贝
  2. 输出一个集合{A,B,C,D}的所有子集
  3. 自定义View及注意事项
  4. 如何自动化部署打包发包流程
  5. JNI是否了解过
  6. 内存回收
  7. classloader
  8. 对热修复以及插件化了解多少
  9. 微信支付宝支付调用时上层是如何封装AIDL的
  10. 如何给一个app瘦身

基本上在以前的面试都有涉及到,依然是问我会的东西,一点点深刻,第9道面试题我记得在掌阅面试的时候那个面试官说微信用地是广播,可是摩拜的面试官说微信用地是start ActivityForResult,这个我决定之后本身去深刻研究下,看看他们究竟是如何实现的,别的问题都是比较常见的。

  • 二面:
  1. 如何实现一个推送,极光推送原理

  2. 说说Http协议,以及Tcp/Udp

  3. 常见的设计模式,如何实现一个观察者模式,若是须要有序通知观察者,该如何操做

  4. 实现一个图片加载框架应该考虑哪些

  5. 线程池有哪些参数,应该如何设计

  6. 性能优化是如何作的

  7. Java为何要推出HashMap,它是如何解决hash冲突的

  8. JVM内存分配,编码时如何注意内存泄露

  9. Binder机制原理

摩拜问地都是很常见的问题,我能感受到面试官在问我问题的时候并不在意我对这个问题掌握地有多好,而是更加关注我对待某个知识点的态度,更多地赋予面试题一个场景,而不是空谈理论,是我比较喜欢的面试官。

  • 三面:
  1. 为何重复造轮子,本身去设计一些框架的缘由
  2. 如何保证线上项目的稳定性
  3. 本身以前作的项目的规模
  4. 聊了聊他们目前在作的项目

三面面试官跟我聊了聊一些新技术,还有就是我本身为何要重复造轮子,我说为了保证项目的稳定性同时可以更好地去定位问题,而后聊了聊他们目前在作的项目,总体感受特别好。

面试以外

上面说地都是一些硬实力,下面简单说些本身在面试过程当中总结的一些面试以外须要注意的东西

  1. 比较重要的面试安排在下午3点左右,由于北京这边的互联网公司基本上都是10点左右上班,那么颇有可能上午面不完,下午接着面,因此3点的话能够给你当天的第二家留有更多的缓冲时间
  2. 大公司的面试尽可能安排在前面,由于大公司的流程特别多
  3. 面试前必定要跟HR沟通好,当天尽量一次性面完,若是不能面完就改时间,尽量不要分两次面,除非状况特殊。
  4. 家中尽可能放一些零食水果之类的,早上能够吃一点再去面试,由于若是面试排地满的话,上午面完以后就得急着赶往下一家,因此我有好几天都是只在晚上吃了一顿饭,特别尴尬的时候有时候在面试的时候肚子在咕咕地叫。

后记

除了上面提到的公司以外,我还面试了人人车(Boss直聘),以及58同城(Boss直聘) **并且也都收到了他们的Offer,因为他们面试的顺序排在后面,并且面试题跟以前的面试题有不少共同点,因此就没有放出来,此外还面试过快看漫画,面了两轮,而后CTO须要改天面,我内心其实比较反感这种公司的,由于做为面试者跑一趟自己就很辛苦,因此后来复试我就没去,还有一家是青橙科技也是须要我去复试,太远了,并且当时手里已经有了Offer就没去,真心但愿这些招人的公司可以在一天内把流程能走完,毕竟像一些大公司在跟我沟通面试的时候都会约定个时间能把全部的面试流程走完。另外还有一家是豆果美食,面试官没怎么聊技术,基本上都是在谈人生,谈理想,最后互相加了微信,而后当时问我有没有别的Offer,我也知道本身不会去那里,而后就说爱奇艺给我Offer了,可能他也知道我不会去了,后来就没有通知复试什么的,不过感受他比较自信,至少比我自信。

虽然本身此次没有进入到BAT等一线互联网公司,头条,滴滴还有陌陌的简历都被刷了,跟那些大佬比起来确实惭愧不少,感受没啥必要写这个面试经历,可是总以为写出来了能够帮到一些人,由于本身以前在技术的道路上也迷茫过,从最初的Android小白,当时看郭霖,张鸿洋还有主席的博客学习,而后在迷茫的时候看主席还有VB的知乎Live,也认识了不少小伙伴,在技术上给了我不少帮助,让我可以坚持走到今天,同时也感谢每个给我面试机会的面试官,Android之路还会一如既往的走下去,但愿这篇文章能够帮到一些人,就像当初帮到个人那些文章同样。

相关文章
相关标签/搜索