12月份辞职,我的如意算盘是年前面一下定下来,然后休息,年后入职~~美滋滋!约面几家发现现在要求都好高啊,技术深度源码架构级,小红书、猿辅导每一面都有算法,算法不过,就止步了。所以就踏踏实实的准备了,年后回来面了一下,最后拿了三家的offer,在这给大家分享一些经验!我觉得很多同学其实技术都是不错的,就是面试的话术上可能表述的不够清楚有条理,所以可能这个面经更偏重与帮大家总结面试时回答的重点,没有特别具体的答案,如果有哪些问题,搞不清楚答案的,可以留言我会私信解答!
有的面试官可能会很客气,说先问一下基础哈,如果你只答基础,那你就太天真了!一定要有延伸~有深度思考~有拓展~,不要给一个合理但是不出彩的答案,一定要给一个有条理的全面的优秀的答案。
一 、View相关
1.自定义View
合理的答案:自定义一个View,需要考虑构造方法,onMeasure方法,onSizechanged(),onLayout,onDraw。
优秀的答案:Android中有几种自定义View,有继承View的,有继承ViewGroup的,有继承特定View的,有继承特定ViewGroup的,然后每一种我们都需要重写哪些方法,为什么有的要重写measure方法等。
面试官延伸:getMeasureWidth 和 getWidth的区别?view的invalidate和requestLayout区别?
2.View的绘制
合理的答案:onMeasure()+ onLayout() + onDraw() 调用顺序,以及父View和子View各个方法在做什么。
优秀的答案:View的绘制从哪里开始的?(加分点可以不说)+绘制基础+自定义View时需要注意的+自己遇到过的坑/在View的绘制流程中有哪些可以优化的点(或需要注意的点)
面试官延伸:LinearLayout和RelativeLayout 测量的区别,多次测量都在测什么?有weight的时候,怎么测量?
3.触摸反馈
合理的答案:涉及到哪些方法,调用顺序,这个部分只要看过应该都能说出来,就是别说的乱了。
优秀的答案:触摸反馈的过程中涉及到哪些角色,比如Activity 、ViewGroup、View,他们都负责做什么,他们接收到不同的事件都做了哪些处理。区分Down事件和Move /Up事件,分别描述。
面试官延伸:滑动冲突 scrollView里面有一个button,然后按住button向上滑,讲述事件传递过程?按住一个button,然后手指移到别处,click事件还能不能响应?
4.ListView RecyclerView
合理的答案:两者使用上的区别
优秀的答案:使用上的区别+缓存机制的区别(源码)
面试官延伸:如何优化
二、Handler的消息处理机制相关
1、ThreadLocal工作原理
合理的答案:作用域+怎么存
优秀的答案:在哪些情况下用+java 的和Android的有什么区别(加分点)+优点(如果没有ThreadLocal,我们就要。。。)+具体应用(looper或者其他应用的实例)
面试官延伸:ThreadLocal和使用synchronized有什么区别?
2、Handler工作原理
合理的答案:handler looper message都负责什么,然后handler.sendMessage之后哪些方法被调用了,最后handler怎么收到的消息。一定要讲源码!!!
优秀的答案:handler是负责线程切换的,结合具体调用源码,讲述怎么切换的,先讲UI和非UI,再讲子线程使用handler和主线程有什么区别。
面试官延伸:一个线程能否创建多个Handler,Handler跟Looper之间的对应关系?looper.loop为什么没有阻塞主线程?子线程的looper.loop()之后的语句吗还会被执行吗?handler的postDelayed方法是在哪个线程等待?View的post方法实现原理?
三、多线程相关
1、volatile关键字作用
合理的答案:保证可见性,禁止指令重排
优秀的答案:jvm内存模型+线程安全(原子性、可见性、有序性)+volatile保证了哪个
2、synchronized原理及使用
合理的答案:保证可见性和有序性
优秀的答案:jvm内存模型+线程安全(原子性、可见性、有序性)+synchronized保证了哪个+底层如何实现(monitor)
面试官延伸:类锁和方法锁的区别?与Lock的区别?
3、Android实现多线程的方式
合理的答案:thread 、runnable、线程池等
优秀的答案:以上加上适用的场景+几种线程池的分析
面试官延伸:sleep wait区别 生产者消费者(代码实现)死锁(代码实现)
四、java相关
1、垃圾回收
合理的答案:什么样的东西是垃圾,怎么回收
优秀的答案:jvm内存模型,GC roots ,垃圾回收算法及怎么选择,Android的Dalvik和ART 在垃圾回收上有什么不同?
面试官延伸:内存泄漏?ooM问题的排查?垃圾回收在哪个线程?
2、类加载器
合理的答案:双亲委托 加载过程
优秀的答案:java有几种类加载器,加载过程,Android 几种类加载器,加载过程,为什么要设计成这种委托模式?JVM在搜索类的时候,又是如何判定两个class是相同的呢?
面试官延伸:插件化、热更新(最好还能扩展除了类加载以外的其他的热更新方式)
3、动态代理 注解 反射
合理的答案:解释概念
优秀的答案:解释概念加上比如动态代理在Retrofit当中的应用 ,自定义注解,反射为什么耗性能
面试官延伸:注解如何实现一个findViewById
4、泛型
合理的答案:解释概念
优秀的答案:为何引入泛型+泛型擦除+泛型边界
面试官延伸:一般会手写代码考你对泛型擦除和边界的理解
5、数据结构(别的不会HashMap也要会的熟练的仿佛是自己写的)
合理的答案:数组+链表
优秀的答案:结构+put元素如何实现+扩容+size()
面试官延伸:ArrayMap和SparseArray的改进?是不是一定比HashMap好?是查找算法好还是结构比hashmap合理?ConcurrentHashMap的原理?(此处坑多,不同的JDK版本结构不一样)
五、优化和设计相关
1、优化相关
合理的答案:网上也很多文章,很多优化点,就怕说不全。
优秀的答案:其实Android的优化涉及的方面比较多,启动优化、内存优化、布局优化、卡顿优化、电量优化、网络优化等,我主要负责过哪部分的优化。。。然后,项目原来。。。优化的目标。。。,我们在线下如何排查问题,用了哪些工具,我们在线上怎么监控,我们怎么保持优化的长期效果等
面试官延伸:这个部分可能会问,你们优化后的具体数值体现?
2、设计相关
这个部分通常都是加分项,可以参照看过的网络框架、图片框架等的结构进行设计。比如一个网络的话,肯定要考虑它的协议层,还有其他负责连接管理和线程管理的基础组件等。
六、开源框架相关
1、网络框架
合理的答案:okhttp retrofit volley如何使用
优秀的答案:源码级别,okhttp(拦截器链的每个拦截器都负责什么+具体应用)retrofit(动态代理+适配器等挖掘里面用的好的编程思想和设计模式)volley我不熟,参考前两个。。。
面试官延伸:如何给某些特定域名的url增加header?https?
2、图片框架
合理的答案:对比Glide 和 Picasso 和Fresco,下载图片的方式,缓存机制,加载到内存的机制都有什么不同。
优秀的答案:以上+深入一个框架的源码,进行分析,比如Fresco的MVC、Drawable层次及绘制,内存缓存、硬盘缓存、职责链模式、对象池、自定义计数引用等
面试官延伸:如果你设计一个图片库?
以上是我在面试过程中出现率比较高的部分,如果大家有遇到过比较好的面试题,可以留言,我在整理补充在后面,先这样,希望大家都能在面试中真正发挥出自己的真正水平~~~