昨天头条Android岗三轮远程面通过,HR打电话通知九月中下旬会再联系,应该是进入备胎池了吧。
个人情况:西北农村211,科班学渣,无实习经历,无牛逼项目。秋招首面,希望能开个好头吧。
一面
算法题 100W 取top100,准备写快排的划分思路,被怼了,不让写,然后我说那用堆吧,然后面试官让用堆,然后堆排序,忘了,写不出来GG
Handler,IntentService,HandlerThread相关
HashMap原理
Android内存泄漏是什么?怎么检测?怎么避免?
算法题,一组数中有一个数出现了一次,其他出现两次,找出这个数,用异或,写完面试官改成两个数,我说了一两句,面试官估计也懂,直接不让我说了,下一个
ANR 相关
项目。。。网络请求相关的一个简单的框架。
好像不止这点,有点忘了。。。
二面
Throwable、Exception、Error三者的关系,Exception和Error有什么区别,Error可以被捕获嘛?(最后一个问题没答好,我猜的是不可以,没答出来为啥)
然后问我一个图片浏览的项目。
涉及到了图片相关的问题,如何防止OOM,Bitmap的压缩,inSampleSize,inBitmap相关,bitmap的复用,一个Bitmap的内存占用怎么计算,LruCache,DisLruCache,Glide的独特的缓存策略,有什么好处和适用场景。Glide的BitmapPool的内存复用。
自己项目中图片列表这一块做了那些优化(提到了RecyclerView滚动时停止加载,停止时再进行加载。
然后就是ViewPager+Fragment+RecyclerView中多个RecyclerView复用同一个RecycledViewPool,减少内存占用,这里大概也提了一下RecyclerView的复用机制)
然后问我一个对OkHttp的封装的项目,然后问我好像问网络挺熟悉啊?
然后场面一度僵硬,因为网络学得并不好,然后就很尴尬得说了一下自己只是在应用层对OkHttp做了一个封装,主要是看了一下Retrofit的源码,学习到了一些优秀的设计,然后自己试着做一下。
然后面试官大概问了一下Http相关的东西,然后是状态码的含义,4xx和5xx有啥区别。非200的状态码怎么处理,怎么反馈给用户?
然后讲了一下某个应用层项目里对网络请求结果这一块的封装。感觉答得不是很好。
多线程同步相关的问题。
提问很宽泛,问我了解哪些,说一下,然后我说了wait notify,不满意,然后我又说了sychronized,还是不满意继续问,然后我又提到了Lock和RetrantLock,和sychronized的大概区别说了一下。
面试官还是不满意,继续问还有呢?我说我想不起来了,面试官一脸失望地问你知道volatile么?好吧,幸好我知道这玩意儿,然而说了一下volatile的意义,保证内存可见性和禁止指令冲排序,举了DCL的单例说了一下。
volatile能保证原子性么?不能。
ClassLoader双亲委托,类加载流程。为啥要使用双亲委托这种模式,有什么好处?(最后一个问题很懵逼,太菜,瞎猜糊弄过去了)
一个算法题,有N个台阶,123456-N,一个青蛙在0处,每次可以跳3或4或5步,给定一个整数N,判断跳到N最少要多少步。
我一开始想得很简单,觉得对5取模,然后找到之前某个点的最少次数,后面一直每次五步就可以了。
然后面试官让证明,我证不出来,然后想了一下这个思路有点问题,然后提到了动态规划,然后写代码,动态规划。
View的绘制流程,onMeasure,onLayout,onDraw,三种测量模式的区别的场景。这里问得比较浅。
大概就是这样,可能还有些忘了。
三面
一上来面试官让自我介绍,然后问我觉得自己哪块学得比较好比较有自信的可以给他介绍一下。
我想了一下,觉得哪一块都没有自信,好像都会一点,好像啥都没有深入,心疼自己。
然后憋了半天说,我好像没有哪个地方很突出的,我学得比较宽泛。
面试官似乎不太满意,很无奈得说,那我问吧。
View的绘制流程,onMeasure,onLayout,onDraw。
然后给了一个简单的自定义View要求。一个正方形的View,内部画一个圆,直径可以指定,让说自定义的流程。问得很细,包括自定义属性在哪里定义的,在哪里获取的,怎么保证View的正方形,怎么保证圆不会超出View,draw的具体流程。
然后问除了onDraw还有哪里可以自定义的,我一开始没反应过来,面试官又问了一遍,好好想想,还有哪里可以自定义的。
然后我想明白了,可以自定义onLayout,实现一些符合特殊布局规则的容器。
然后我拿FlowLayout作为例子说了一下自定义onLayout。
View的事件分发机制,自己随便提了滑动冲突的解决方案。
项目,基于OkHttp那个封装,怎么构建请求的,怎么解析请求的,怎么实现线程切换。
这里提到了一下Handler,然后追问Handler,于是把Handler那一套说了一遍,没有追问到native层,我也没敢提。
然后回到项目,我提到了解析回调的类型,不传入xx.class,不够优雅。
然后面试官问我那怎么实现的,然而我提到了用泛型,运行时动态通过传入的泛型Callback来解析T的类型,这里大概扯了一下Java的伪泛型,这里提到了用getGenericInterfaces得到Type,然后用这个Type去解析。
然后面试官问到了如果这里的T是List怎么办,能解析出来吗?我想了一下,表示应该不能,然后表示这是自己一个练手的东西,考虑得不够全面。
面试官表示没啥,可以理解,但是商业化项目里肯定要考虑这些。
写一个线程安全的懒汉式单例,不能用静态内部类实现,那这里显然问得是DCL+volatile,搞定
IPC相关。大概提了几种常见的IPC方式,最后还是得回到Binder,Java层的应用说得比较细,底层原理大概提了一下,没往深问。
算法题,判断一个树是不是AVL树,这个问题应该在剑指offer上看到过,这个题写得很烂。
写得有问题,然后面试官自己写了一个,让我看看有啥问题,看到了一句比较关键的话,但是没有怎么理解。
沟通了一下思路,面试官表示他那个也有问题,不过比我的更接近正解,还说这个问题不难,回去好好想想。
最后有啥要问的,问了一下面试评价,有哪些不足,给点建议。面试官说基础理论还行,动手能力还需要加强。多写代码
大牛提醒:校招跟社招的的一个区别就是,校招一定会问算法问题,社招一般不会问,所以请童鞋们在面试前刷一遍算法题,切记不要抱侥幸心理。
欢迎关注微信公众号:大牛孵化器,更多免费知识分享教程等你来领取。