前言
我是从小公司跳出来的,最终入职OPPO,说实话这段时间的经历让我深深地感受到,我们为跳槽做的一些临时抱佛脚的提升跟那些大佬的沉淀比起来太渺小了。我们都知道找资料学习、刷面试题,但也许只能应付这一次的面试,后面还是会技术发愁,那些短时间背下来的东西迟早会忘掉,大家还是做好长期提升自己的准备,好好沉淀的东西最后才是属于自己的。
说说当时的面试过程,我是内推获得的面试机会,很感谢当时帮我内推的兄弟,总共三轮面试,两轮技术,一轮HR面,当天面试结束。
我10:10分到的公司,10:30开始面试,第一轮面试将近一个小时,聊的点我基本上都答得上来,自我感觉良好。然后面试官让我等一下,他去叫他们老大来给我二面,我等了有二十几分钟吧,二面有一个多小时,这次问的比较深,有些地方答的有些嗑吧,总体来说我自己是满意的。HR面约到下午了,整个流程下来每轮面试官都让人感觉很不错,我自己做的准备也让我面试感觉下来很爽。
面试题
我把面试遇到过的以及自己学习用到过相关内容都整理到一起了,方便自己进行复盘和后续的查漏补缺:
一、 Java基础
1.1 静态内部类和非静态内部类的比较
- 静态内部类和非静态内部类的区别
- 扩展:内部类都有哪些?
- 局部内部类
- 匿名内部类
1.2 多态的理解与应用
- 多态概述
- 多态中成员的特点
- instanceof关键字
- 多态的转型
- 多态案例
1.3 java方法的多态性理解
- 什么是java的多态
- 运行时多态
- 代码理解
1.4 java中接口和继承的区别
1.5 线程池的好处,详解,单例(绝对好记)
- 线程池的好处
- 线程池的详解
- 线程池的单例
1.6 线程池的优点及其原理
- 使用线程池的好处
- Executor框架
- 线程池大小确定
1.7 线程池的优点(重点)
1.8 为什么不推荐通过Executors直接创建线程池
- 缓存队列 LinkedBlockingQueue 没有设置固定容量大小
- 最大线程数量是 Integer.MAX_VALUE
- 拒绝策略不能自定义(这个不是重点)
- 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯(这个不是重点)
1.9 不怕难之BlockingQueue及其实现
- 阻塞与非阻塞
- LinkedBlockingQueue 源码分析
- ArrayBlockingQueue源码分析
1.10 深入理解ReentrantLock与Condition
1.11 Java多线程:线程间通信之Lock
- synchronized的缺陷
- Lock类接口设计
- ReentrantLock可重入锁
- ReadWriteLock读写锁
- 公平锁
- Lock和synchronized的选择
1.12 Synchronized 关键字原理
- Synchronized 原理
- Synchronized 优化
- Synchronized 和 ReenTrantLock 的对比
- Synchronized 与 ThreadLocal 的对比
1.13 ReentrantLock原理
1.14 HashMap中的Hash冲突解决和扩容机制
- 关于HashMap
- 关于Hash算法和Hash冲突
- HashMap中的处理冲突
- HashMap中的扩容机制
1.14 Java并发
1.15 Java虚拟机
1.16 JVM常见面试题
- Java内存区域
- HotSpot虚拟机对象探秘
- 内存溢出异常
- 垃圾收集器
- 内存分配策略
- 虚拟机类加载机制
- JVM调优
- 类加载
- JVM内存模型
- Java中一个对象从创建到销毁的过程和JVM类加载过程
1.17 JVM内存结构
- JVM内存结构【方法区+虚拟机栈+本地方法栈+程序计数器+堆】
- Java中的对象一定在堆上分配吗?
1.18 类加载机制/双亲委托
- java类加载机制和类加载器以及双亲委派原则解析
二、 Android基础
2.1 Activity知识点(必问)
- Activity启动过程全解析
- 启动模式以及使用场景
- onSaveInstanceState以及onRestoreInstanceState使用
- onConfigurationChanged使用以及问题解决
2.2 Fragment知识点
- Fragment的通信问题, 新建Fragment为何不要在构造方法中传递参数
- 为什么官方推荐Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?
- Androidx 下 Fragment 懒加载的新实现
- Fragment全解析系列(一):那些年踩过的坑
- Google-Fragment概览
- Google-与其他Fragment通信
2.3 Service知识点
- Handler知识点(必问)
- Android主线程阻塞处理及优化
- 深入聊聊Android消息机制中的消息队列的设计
- 深入理解MessageQueue
- 你真的懂Handler.postDelayed()的原理吗?
- Handler.postDelayed()是如何精确延迟指定时间的
- Handler延迟消息执行机制,会阻塞吗?
2.4 Intent知识点
- Android跨进程传递大内存数据
2.5 数据存储
三、UI控件篇
3.1 屏幕适配
- Android屏幕适配和方案【整理】
- Android 目前稳定高效的UI适配方案
3.2 主要控件优化
- RecyclerView优化
3.3 事件分发与嵌套滚动
- 一篇文章让你轻松弄懂NestedScrollingParent & NestedScrollingChild
3.4 动态化页面构建方案
- Android | Tangram动态页面之路(二)介绍
- Android动态界面开发框架Tangram使用完整教程
四、网络通信篇
4.1 网络协议
- 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)
五、架构设计篇
5.1 MVP架构设计
- 高级MVP架构封装演变全过程
- Android—我所理解的MVP模式
5.2 组件化架构
- Android为什么要用组件化?
六、性能优化篇
6.1 启动优化
- Activity启动流程
- Android性能优化–启动优化
6.2 内存优化
- Android性能优化:这是一份全面&详细的内存优化指南
- Android性能优化:手把手带你全面了解 内存泄露 & 解决方案
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
6.3 绘制优化
- Android性能优化:那些不可忽略的绘制优化
6.4 安装包优化
- Android 安装包优化–减小安装包体积
七、源码流程篇
7.1 开源库源码分析
7.2 Glide源码分析
- Android面试题:Glide
7.3 day 20 面试题:Glide面试题
- Glide的优点
- 生命周期绑定原理
- 缓存原理
7.4 聊一聊关于Glide在面试中的那些事
- 来简单介绍下Glide的缓存
- 具体说一说Glide的三级缓存原理
- Glide加载一个一兆的图片(100 * 100),是否会压缩后再加载,放到一个300 * 300的view上会怎样,800*800呢,图片会很模糊,怎么处理?
- 简单说一下内存泄漏的场景,如果在一个页面中使用Glide加载了一张图片,图片正在获取中,如果突然关闭页面,这个页面会造成内存泄漏吗?
- 如何设计一个大图加载框架
7.5 面试官:简历上如果写Glide,请注意以下几点…
- 谈谈Glide
- 假如让你自己写个图片加载框架,你会考虑哪些问题?
7.6 Glide OOM问题解决方法汇总
7.7 LeakCanary源码分析
7.8 OkHttp源码分析
- OkHttp源码解析
- Okhttp面试简答
- okhttp面试题----拦截器interceptor
- Okhttp3 总结研究 (面试)
7.9 okhttp连接池复用机制
- 概述
- 连接池的使用
7.10 okhttp 流程和优化的实现
- 概述
- 异步流程的实现
- okhttp 中有哪些优化,优化是怎么实现的
- okhttp 中用到了哪些设计模式
7.11 一篇让你受用的okhttp分析
7.12 OkHttp面试之–OkHttp的整个异步请求流程
7.13 OkHttp面试之–HttpEngine中的sendRequest方法详解
7.14 OkHttp解析大总结
7.15 Okhttp任务队列工作原理
- 概述
- 线程池的复用和管理
7.16 Android高频面试专题 - 架构篇(二)okhttp面试必知必会
- HTTP报文结构
- HTTP发展历史
- okhttp有哪些优势
- okhttp使用
- 看过okhttp源码吗?简单介绍一下
- 同步请求详细源码解读
- 异步请求详细源码解读
- okhttp实现网络请求的方法
- okhttp实现带进度上传下载
- 为什么response.body().string() 只能调用一次
- okhttp运用的设计模式
7.17 Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成
- DNS 和 HTTPDNS
- OKHttp 接入 HTTPDNS
7.18 Retrofit源码分析
- Android:手把手带你深入读懂Retrofit 2.0源码
7.19 RxJava源码分析
- RxJava操作符之创建操作符(三)
- RxJava操作符之转换操作符(四)
- RxJava操作符之过滤操作符(五)
- RxJava操作符之组合操作符(六)
7.20 RxJava原理与源码分析
- RxJava的消息订阅和线程切换原理
7.21 RxJava如何进行线程切换的?
- RxJava 是如何实现线程切换的(上)
- RxJava 线程切换原理
- RxJava2线程切换原理分析
7.22 Rxjava内存泄漏防止方案——RxLifecycle,AutoDispose,RxLife框架
- Android 使用RxLifecycle解决RxJava内存泄漏
- 解决RxJava内存泄漏(前篇):RxLifecycle详解及原理分析
- RxLifecycle详细解析
- 使用Rxjava2导致的内存泄露问题
- Rxjava解除订阅②:AutoDispose
7.23 Tinker源码分析
7.24 ARouter源码分析
- ARouter原理剖析及手动实现
- ARouter组件化框架原理分析
- Android之ARouter使用和原理解析
- 手动实现一个路由框架EasyRouter
- Arouter核心思路和源码详解
- ARouter源码分析(四)—— 缓存与优化
- 我所理解的Android组件化之通信机制
- ARouter系列三:依赖注入暴露服务
- ARouter系列一:Activity跳转原理详解
7.25 Android框架层源码解析
- Java层源码解析
7.26 算法设计
- 时间复杂度
- 数据结构
- 浅谈单链表与双链表的区别
八、新技术篇
8.1 实战问题篇
- Android工程中方法数超过65536解决方法
九、面试篇
9.1 开源文档
9.2 面试文献
- Android 面试题积累 (高阶)
结尾
以上就是我的学习和面试积累,有自己面试经历过的,也有整理的一些大厂面试题,篇幅有限,具体内容就不展示了,我已经整理成文档了。
还是开头说的,仅靠面试期间临时抱佛脚和刷题对自身发展不是长久之计,做好长期提升的规划,好好沉淀每一次的学习和面试经历,把这些最终都转化成属于自己的东西才是实质上对自己最有用的。