2020 字节跳动,腾讯,网易云,美团 Android 面试题
Q15:说说三级缓存、Handler 机制 ?
如果您有多余的时间,可以聆听下我的故事
从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我 offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所以在智联招聘上选好工资范围,就一顿海投,做等面试电话!
做两快三年的 Android 开发,工作的任务也就是一些界面的编写,RecyclerView 的简单使用,网络框架也是别人封装好的直接用,再就是集成些第三方的分享、支付什么的!技术上的提升可以说根本没有,和工作一年左右的人,比起来就多几个项目优势!所以这次出来找工作还期望 15K,说起来心里很慌!有哪些原因呢?
1、小公司要求不高,自己也抱着只要能做出功能的态度
2、对行业趋势把握不准,没有未来规划(所谓混吃等死)
3、对自己的工作不感兴趣,上班有空闲时间也不会去深入学习
再来说说这次找工作面试的一些经历和感想!这次面试大大小小面试了十多家!依我自己在简历上写的几个商城类 APP 的工作经验,在智联和拉钩上也只有小公司能叫我去面试!(所以说技术深度很重要)
前面两次的由于面试没怎么准备,直接 over 肯定是没问题的!第一家一个小姐姐把我问得 n 脸懵逼(一个屌丝程序猴和妹子聊天就紧张,心跳加速,口干舌燥,说话结巴)!她首先让我自我介绍一下,可脑袋一下像短路了一样!就说:“你知道的程序员表达能力差,嗯。。。嗯。。。你看简历吧!”她直接一脸无语!
接着她就看到我简历有 (Q1)ListView 和 RecyclerView 的使用,就问我它们有什么区别? 我也就只能简单的答答 RecyclerView 怎么使用 ListView 怎么使用!然后她又问我 (Q2)既然 RecyclerView 在很多方面能取代 ListView,Google 为什么没把 ListView 划上一条过时的横线?我当然是不知道怎么回答,然后就请教她,然后她就告诉我 ListView 采用的是 RecyclerBin 的回收机制在一些轻量级的 List 显示时效率更高!顿时我就服气了!
后来又问我(Q3)你用过 MVP,那你知道 Dagger2 吧,介绍下吧?我又是一脸懵逼!这次面试就这样被个妹子给干趴了!从这回去我就开始回去看 ListView 和 RecyclerView 的区别、缓存机制、Android MVP+Retrofit+dagger2+RxAndroid 框架等等!
第二天又去一家小公司,这次是我用***“不知道”回答的最多的一次!(但我从容面对这样的结果,因为自己真的很菜)面试一上来也是让我做自我介绍,由于这次做了准备,回答起来没那么难!后来他开始问我技术问题(Q4)HashMap 的内部实现原理?我想了下只能说“不知道”!接下来就问我(Q5)Activity 生命周期,有哪些启动模式,以及应用场景?这个还是难不倒我的!问到(Q6)你用过 AsyncTask,那你跟我说说 AsyncTask 的内部实现原理?因为我昨晚看了下,就开始跟他说首先我说说它的出现是为了解决在子线程中做了耗时操作后需要回到 UI 线程去更新这样一种情景,然后就开始准备说它的四个方法(doInBackground(Params...) 、publishProgress(Progress...)、onProgressUpdate(Progress...)、onPostExecute(Result)),他立刻就打断我了,说我问的是内部原理,(Q7)内部维护了一个线程池,是串行还是并行,怎么维护的?这一问,我又是一脸懵逼,只能说“不知道”!他也很无奈,又问(Q8)那你说说线程池的四种初始化吧?我的第一反应是看都没看过,一句“不知道”又让他无语了!此时的我死猪已经不怕开水烫了!(Q9)你用过 MD,你知道怎么定义一个 Behavior 吗?“不知道”!(Q10)RecyclerView 的拖拽怎么实现的?“不知道”*!最后一曲凉凉送给自己!
接下来的几家公司都是创业型的小公司,面试的人都是一些不懂 Android 开发的或者是会一点点!首先上来就是自我介绍,这我都说了好多遍了,我 15 年毕业于哪里哪里,从毕业一直到现在从事的是 Android 开发的工作,做过什么什么类型的项目!大学学的是软件工程,学过 Android、计算机网络、嵌入式、数据库、C#等等!(一顿操作猛如虎,哈哈。。。)但是这些创业型的小公司都要求你有能独立完成 APP 的能力,然后就跟你说什么公司背景有多牛呀,有期权股份呀,我们团队怎么优秀,这个平台能提升你很多能力呀,但是我们刚开始呀不会给你开太高的工资,但我们年终业绩好的话可以给你发 4~6 个月薪资给你做奖金!可能在这期间要加加班呀什么的!
在这些中有一家都面试到了和项目经理谈了,自我感觉和技术总结聊得很不错,和项目经理也谈了自己未来的规划,先从 Android 入手技术深入,然后再自学 H5 前端,再像 java 后台靠拢做一个全栈工程师!项目经理也说你过来我们这有很好 java 后台资源,而且 Android 会交給一个人来做,未来业务发展也会加入 H5,我们这能给你提供这样的一个平台!最后在某些方面我们的目标达成一致了,行先这样,我们再商量下,你回去等通知吧!结果我回去了,加了技术总监的微信,傻傻等了一天,啥也没等来!(忠告:基本叫你回去等通知的都是没戏!)
当然这些公司中也有向我抛出橄榄枝的,有一家给我试用 8k(不交社保),转正 10K,大小周!一不交社保,二是大小周,三是那没我想要的,我思来想去,辗转反侧,以不能把自己贱卖为由,我果断谢绝了!
比起套路,我更喜欢那些能直白告诉我结果的人!在去一家稍微大点的公司,首轮就是笔试!我笔试有一道算法题和数据库的题做不出,当时就知道这次没戏了!但很感谢面试我的那哥们,和我一样 15 年毕业的,但很牛逼!他拿着我的笔试答卷,*(Q11)首先是写一个 SingTop,那哥们就问我,单例要注意些什么?我首先回答的到的同步问题,再说构造方法私有,可我忘了一点静态调用!那哥们就给我一条条理出来 1、构造函数私有? 2、含有一个该类的静态私有对象? 3、有一个静态的公有的函数用于创建或获取它本身的静态私有对象? 4、其次才是考虑线程同步!(Q12)*一个按升序排列好的数组 int[] arry = {-5,-1,0,5,9,11,13,15,22,35,46},输入一个 x,int x = 31,在数据中找出和为 x 的两个数,例如 9 + 22 = 31,要求算法的时间复杂度为 O(n);
我给出的答案是:
1、先用二分法排除比 x 大的数,得到 pos
2、再从 0 到 pos 通过两层 for 循环通过一个数与剩下的所有数来相加,等于 x 的时候 break 循环
那哥们就开始给我分析,首先第 1 点想法就是错的,应为给出的数组中有负数,负数+正数有可能得到中间的那个数,再则它这靠得是一个双向逼近的算法!
接下来是一个数据库题目*(Q13)*如何向一个数据库具有 int 类型 A,B,C,D 四列的表中随机插入 10000 条数据?如何按升序取出 A 列中前 10 个数?这道题我没答,我以为考的是数据库操作的基本语法!后来那哥们慢慢跟我分析这道题的考点在哪?他说:“这些语法我也不记得,但是像我们这样具有两年多工作经验的人百度一下也是能做得出的,但是这里考的不是基本语法,**数据库其实也就是一个文件,一个具有固定封装特定语法操作的文件,既然是文件读写就要考虑到
效率问题!在数据库中提高效率用到什么,是事务!如果一条条插入,其实每次插入都会维持一个事务,也就相当于文件的打开和关闭**,10000 次的打开和关闭是很消耗性能的,所以要在插入前使用 BEGIN TRANSACTION 开启事务,再 10000 条数据插入完成时用 END TRANSACTION 结束事务,这样就相对于文件只打开了一次,10000 条批量操作完后,再关闭文件!”
下面一题是*(Q14)*service 两种启动方式有什么区别?我回答得很简单!他就直接说“面试这笔试也是很重要的一部分,简历大家可以随便写,但是一些技术水平在笔试这是有所体现的,所以在我这笔试这关是没有通过的!”这个时候我挺服气的,毕竟是自己准备不好。后来那哥们就跟我说:“这面试题该背的该记得还是要记,花个两三天或者一周去准备,对自己多要一两 K 也是很值得的,所以该辛苦的还是要辛苦下!”我挺感谢这位哥们的,也挺喜欢和这样率直随意的人打交道!
最后经过两个星期的面试,找了一家符合自己发展方向做智能硬件的公司!经过这段时间的面试,懂得了技术深度的重要性,还有职业规划的重要性!目前个人认为纯 App 开发很容易被取代,我个人的职业规划
1、以 Android 技术为基础深入,再学前端,再扩展到 Java 后台,做到一个全栈工程师
2、向 Android 智能硬件,NDK 开发转型,因为我大学搞过嵌入式,有些基础,这一行门槛稍微高些不容易被取代!目前来说自己是打算朝着第二点去发展了!
评论