快手安卓客户端面经
好久没面试了,八股文肉眼可见的磕巴。
一面
- JVM内存模型,各个内存区域的用途。
- 哪些区域是线程共享的,方法区为什么线程共享?
- 哪些区域不会产生OOM。
- 垃圾识别和回收算法,哪些对象可以成为GCRoot?
- 如何确保所有的对象都被穷举(???)
- 垃圾收集器的分类?并行收集器的原理?(没答上来)
- 类和对象的加载过程?双亲委派机制?
- 双亲委派机制的好处?如何自定义类加载器?
- 自定义类加载器的用途?生产环境中有没有用到过?
- 动态代理的实现和原理?生产环境中有没有用到过?
- 除了动态代理如何实现AOP?(答了字节码插装,把自己往坑里带)
- 插装有哪几种方式?生产环境中有没有用到过?
- 注解的作用?有哪几种分类?元注解有哪几种?生产环境中是否用到?
- Java多线程问题的本质是什么?(答了线程同步问题,面试官说不太对)
- volatile关键字的作用和使用场景?除了单例还有啥?(没答上来)
- 线程池的原理?有哪几种拒绝策略?
- 线程的生命周期?是否可以直接调用stop终止线程?
算法题:反转链表二:从n到m的结点进行反转。
二面
- 项目中是否用到数据库?数据库的三个范式?
- 如何进行分页查询,sql语句怎么实现?
- 手写一个双重校验的单例模式,为什么要进行双重校验。
- View的绘制流程,如何通过自定义view实现一个动画效果。(答了更改属性后进行重绘)
- 重绘需要调用哪个方法?invalidate和requestLayout有什么区别?
- View的事件分发机制?子view的onTouch方法返回true后,是否还会继续分发?
算法题:求出二叉树的深度
感觉二面比一面问得少一些,问题也更加常规。
对于知识的学习还是要更加系统,不能知其然不知其所以然。
总结:
一方面是工作确实很忙,每天都在写需求,解决线上问题什么的。
一方面是自己确实有些懈怠,理论基础忘的比较多。和实际项目的结合也不是太好。
给大家的建议就是,调整心态,不要传播焦虑,做好自己就足够了。