引言
记得自己在20年最后一天发表过一篇博客,在里面曾经立下进大厂的豪言。为了实现这个“小目标”,除了每天给自己充电外,还赶在金九银十前认真系统地复习了一个半月,终于有信心在九月正式开始大厂面试,其中包括百度,爱奇艺,网易,京东,小米,搜狐,作业帮等,最终我也是如愿入职其中一家公司。
每次面试后我都会及时复盘总结面试题,查缺补漏,我将会把这些面试题都分享给大家,主要是给2年左右Android工作经验的同学一个参考。面试中难免会问到项目相关的问题,因为每个人参与的项目以及技术栈各不相同,我觉得参考意义不是很大,所以在这里我会把面试中有关项目细节的问题省略。为了对面试公司负责以及避免不必要的麻烦,公司名将会用字母编号代替,至于它们之间的对应关系,各位看官同学请自行脑补吧,哈哈~
A公司 一面
- 自我介绍
- mmkv对比sp优势,实现原理
- SP的存储原理
- 讲一下内存映射
- 操作系统为什么设计虚拟内存
- 操作系统分页和分段区别
- TextcureView SurfaceView View区别
- 对ijkplayer的应用,底层实现
- JNI应用
- webView与Native交互
- 提高webView加载速度
- 事件分发流程,涉及phonewindow decorview,设计模式
- 布局优化方式,分析方式
- Merge include标签区别
- Inflate()提高加载布局方式
- FPS标准,Android规定数值范围,60fps
- getWidth() getHeight(),及时获取宽高
- HandlerThread
- 项目中如何创建线程,new thread()弊端,性能消耗点
- 线程间消息通信 Handler
- 主线程 new Handler()为什么不规范,如何避免
- 消息队列的实现方式(数据结构)
- Handler立即执行消息-同步屏障
- 抽象类和接口区别
- 编译执行与解释执行区别,java属于哪种
- JVM内存区域
- BitMap内存分配java,native,为什么这么设计
- 算法:判断字符串合法“(”“)”“{”“}”“[”“]”
A公司 二面
- 说一下之前工作中印象比较深刻的内容
- 除了canvas有没有其他绘制方式,OpenGl是否了解
- 线性布局中三个textView均分如何实现,系统中哪一层实现,原理
- Activity A singleTop模式 在栈底,B,C standard模式,B在A上,C在B上,C如何启动A,才能复用A
- 如果A是 singleTask模式,讲一下ABC生命周期如何执行
- OnNewIntent() 和 onStop() onDestory() 顺序
- Activity生命周期什么时候可见,可交互, 不可交互,不可见
- Service项目中使用场景
- 执行什么方法可以让Service的onDestory
- ANR类型,区别
- 启动清单文件中未注册的Activity会报异常,说下这个流程
- 清单信息会被保存在哪里
- AMS PKMS区别,如何通信
- Android系统启动流程
- 题目1:考察java 静态分派
public class StaticDispatch {
static abstract class Human{}
static class Man extends Human{}
static class Woman extends Human{}
public static void method(Human human){System.out.println("Human");}
public static void method(Man man){System.out.println("Man");}
public static void method(Woman woman){System.out.println("Woman");}
public static void main(String []args){
Human h = new Man();
Human h2 = new Woman();
method(h2);//输出Human
method((Man)h);//输出Man
}
}
- 题目2:考察String常量池
String s1 = “abc”; String s2 = “abc”; String s3 = new String(“abc”);
s1 == s2? s2 == s3?
- JVM内存划分
- String 缓冲池 存储在什么地方
- 一个APP能否实现多进程
- jectpack用过哪些组件
- 算法:快速找到拐点{1,2,3,4,5,3,2,1},先憎后减,5是拐点
- 反问
A公司 三面
- 自我介绍
- 详细说一下工作中有挑战,有成就感的事情,有没有可以优化的地方
- 遇到了哪些问题,如何解决的
- 项目的组件化规划,为什么要这么设计
- 项目中ijkplayer应用,存在什么问题,如何解决
- 视频播放原理
- 自动登录功能如何实现
- 项目中的信息存储加密
- 近几年的职业规划
- 团队规模
- 对团队的贡献
- 加班情况,态度
- 离职原因
- 目前薪资,在面哪些公司,offer情况
- 反问
B公司 一面
- 自我介绍
- Fragment/activity生命周期区别 内存泄漏、OOM区别,具体场景 排查
- 内存优化
- 软引用、弱引用区别
- 过度绘制,原因,检测
- Anr 发生原因,排查,解决
- 垃圾收集器的工作机制
- 算法:二叉树之查找指定节点所在的层数
- 反问
D公司 一面
- 自我介绍
- ==,equals()区别,重写equals()需要注意什么
- HashMap/HashSet区别
- HashSet如何实现值唯一
- HashMap内部存取原理
- 如何使HashMap线程安全
- 线程池的创建方式,核心参数,配置
- Java内存模型
- Volatile和synchronized
- 锁的信息保存在什么地方
- Activity启动模式
- Handler机制
- 主线程往子线程发消息
- 子线程new Handler()注意什么处理,为什么主线程不需要
- 如何实现线程和Looper的唯一对应
- Handler内存泄漏原因,完整调用链
- webView提前加载需要注意的地方
- webView优化点
- 检测内存泄漏方式
- Leankcanary原理
- 检测布局卡顿方式,优化方式
- 为什么离职
- 反问
D公司 二面
- 自我介绍
- 说一下使用MVP,MVVM的感受
- MMKV原理,优势
- Android多进程
- 如果多个SDK存在依赖关系,如何加载更加优雅
- 项目中的组件化介绍
- 介绍项目整体架构,如果想要重构,如何设计
- 内存泄漏如何检测
- 近几年的职业规划
- 反问
J公司 一面
- 手写快排,时间复杂度,空间复杂度,应用场景
- Object方法
- equals() hashcode() 使用场景
- HashMap解决hash冲突
- Java垃圾回收机制
- Android 内存泄漏 排查方式,检测原理
- 团队开发是如何规避内存泄漏(从检测、避免、解决、监控方面讲)
- https工作原理(从安全加密机制上讲)
- Handler message关系
- Looper死循环
- 讲一下Retrofit,优势,原理 对比okhttp
- Flutter 优势
- 屏幕适配方案,自己如何设计
- webView模块 与JS交互
- WebViewClient对比WebChromeClient
- StartActivity流程(越详细越好)
- 为什么使用binder
- onCreate渲染页面的流程
- 手机触摸屏幕 事件传递流程
- 临时发版出现bug如何处理
J公司 二面
- Java虚拟机对比Android虚拟机
- 为什么要单独设计Android虚拟机
- String StringBuffer StringBuilder区别
- String特点,不可变,原理,为什么这么做,有什么好处
- Final 修饰的特点
- Int integer区别,使用场景, 为什么这么设计
- 装箱、拆箱 怎么实现
- 泛型擦除 什么时机
- Volatile 声明i i++是否线程安全 原因
- 实现线程安全的方式
- 讲一下线程池,优点,核心参数,配置
- Glide三级缓存机制
- H5与native交互方式
- 使用的网络框架-Retrofit 优势
- 网络请求公共参数
- 数据存储方式
- 手写算法:单词字母反转welcome to —> emoclew ot
J公司 三面
- 自我介绍
- 之前工作经历中最有成就该的事情
- 项目中遇到的最困难的事情是什么,如何解决,具体细节
- JS与Native交互方式,原理
- addJavaScriptInterface()有什么安全隐患
- mmkv对比sp优势,原理
- 讲一下内存映射,为什么可以提高效率
- Sp是否支持多线程,原理,为什么不支持多进程
- 在项目中承担的角色
- 说一下印象深刻的异常,如何排查解决的
- 通常情况该该如何查找原因排查crash
- 近期个人规划,学习的方式
- 对团队氛围的期待
- 如何看待加班
- 反问
S公司 一面
- 自我介绍
- Viewpager2与viewpager1的区别,优势
- Rxjava实现原理,常见的操作符
- Retrofit实现原理
- Okhttp实现原理,拦截器应用的设计模式
- Glide实现原理,LRU的实现
- Native与JS交互
- 模块化,与组件化的区别
- 组件间通信的方式
- Ijkplay使用过程遇到哪些问题
- 帧动画与属性动画区别
- 自定义View如何应用
- Measure,layout,draw主要工作
- requestLayout(),postInvalidate(),invalidate()区别
- Handler原理,Message中的设计模式,message如何找到处理它的对象
- 事件分发机制
- 熟悉哪些设计模式
- MVVM的优势
- 算法:连续子数组的最大和
W公司 一面
- 自我介绍
- == equals区别
- 包装类型==判断是否相等(Double、Integer)
- String s = “a”和 String s = new String(a)什么区别
- String str1 = “a”+”b” ; String str2 = new String(a)+new String(b);
- Str1和str2是否相等,有什么区别,从编译期解释一下
- 抽象类是否能够不含有抽象方法,能否被final修饰
- Sleep()/wait()区别,wait使用注意点
- ThreadLocal作用,原理,Android中使用场景
- Handler机制, callbak、Lopper阻塞
- Java四种引用
- 弱引用判断对象回收,为什么不使用软引用,哪种GC类型
- Https优点
- webSocket是否了解
- Fragment回调Activity方式,需要注意什么
- 讲一下binder机制,解释一下一次拷贝
- requestLayout()和invalidate()区别
- Android中数据共享的方式
- Android11中对ContentProvider的限制
- 解决滑动冲突的方式
- JS回调webView中的方法发生在什么线程
- 是否了解Flutter
- JVM句柄和直接引用区别
- Jvm方法区存储什么,String常量池
- 算法:倒数第K个结点,要求一次遍历,无额外空间复杂度
- 反问
W公司 二面
- 自我介绍
- MVP,MVVM优缺点,使用感受
- 详细说一下工作中有挑战,有成就感的事情
- Android绘制机制
- 算法:合并有序数组
- 反问
X公司 一面
- 自我介绍
- Activity生命周期 横竖屏
- Android存储方式,使用过哪些,具体介绍
- Android数据库
- Sharedprefens 对比 mmkv, 优势 原理
- 注解
- 网络框架
- Rxjava
- 算法:最大公约数,不要求复杂度
- Mvvm的优点,解耦
- 布局,mvvm架构下的布局有什么区别
- Android功耗
- Anr
- Crash
- Mmvk引入依赖注意的点
- 编译速度优化
- 兴趣爱好
X公司 二面
- 自我介绍
- 泛型应用,泛型擦除如何实现
- 通过反射调用hashmap put方法传入不同的类型是否会报错
- HashMap内部结构,链表转为红黑树的条件
- HashMap 扩容
- HashMap线程不安全,有什么方式可以线程安全的使用HashMAP
- ConcurrentHashMap的同步机制,对比HashTable,优先考虑使用哪个
- AQS原理
- 常见AQS的实现——锁
- 公平锁和非公平锁区别
- 讲一下线程池,优点,核心参数,配置
- handler机制
- 子线程new handler能否直接工作,为什么,怎么处理, 主线程为什么可以
- 子线程Looper死循环如何处理
- 多个handler发送消息如何做到线程安全
- 事件分发机制,采用什么设计模式
- Retrofit 如何通过注解生成完整的网络请求 RecycleView四级缓存
- 内存泄漏检测方式
- LeakCanary原理,如何做到自动监听
- MVVM框架,ViewModel使用
- 组件化
- 算法:二叉树的前序遍历(非递归)
- 反问
X公司 三面
- 自我介绍
- 简单介绍一下做过的项目
- 需求开发流程,开发周期
- 团队规模
- 介绍项目架构
- 模块划分的依据
- 介绍项目中MVC MVP 各模块组成
- 项目中MVVM应用,特点
- 项目中有挑战性的工作,详细介绍下细节以及如何解决难点
- 详细介绍下项目中的性能优化,取得的效果
- StartService bindService区别,使用场景
- Activity生命周期
- A启动B,A和B的生命周期变化
- 讲一下属性动画,方法参数
- RecycleView的缓存复用机制
- 有没有解决过页面卡顿、掉帧问题
- Jectpack使用过哪些组件,简单介绍一下
- 项目中崩溃监控以及修复
- 算法:快速查找行列有序的矩阵中的指定元素
- 反问
Y公司 一面
- 自我介绍
- == equals区别 使用 hashcode()
- 创建、启动、结束线程
- LinkedHashMap和HashMap
- Lru缓存 原理 实现
- get post区别
- View 事件分发流程
- View viewGroup区别
- 复用布局方式
- Merge include标签区别
- Stub标签 原理 使用
- 组件化 组件间通信
- 未使用的资源会被打包进apk吗,打包什么资源由什么决定
- 内存优化的场景
- 接收广播中能不能发送网络请求
- 三方库源码,选一个最熟悉的讲
- Glide的亮点
- 阅读源码学到了什么
Z公司 一面
- 自我介绍
- 64位手机能否正常运行32位应用
- 内存泄漏检测排查方式
- LeakCanary相关原理
- Android Profiler Memory工具使用,如何判断内存泄漏
- 为什么需要主动点击工具的gc
- jvm内存划分,Gc主要清理哪一部分
- 判断对象存活的方式
- Handler工作原理
- MessageQueue内部结构实现原理
- Looper死循环为什么不会导致应用卡死?休眠机制
- 介绍下项目中的组件化使用,为什么使用组件化
- 项目整体结构介绍,团队规模,自己角色定位
- 应该需要把哪些模块进行组件化开发
- 权限请求RxPermission原理,有什么优势
- Sp对比MMKV 各有什么优缺点
- MMKV迁移到其他新的存储方式中能否实现
- Sp使用中有什么问题,apply和commit对比
- Sp存储原理,为什么这么设计
- 项目中对RecycleView使用的优化
- 有没有对RecycleView缓存优化
- Glide流程、原理、LRU机制、磁盘缓存分为哪些部分
- 对kotlin了解程度
- Jectpack组件用过哪些
- 未来两到三年的职业规划
- 学习Android的方式
- 阅读过哪些源码,如何学习的
- 反问
Z公司 二面
- 自我介绍
- 主要的求职诉求
- 目前offer情况
- 主要技术栈是什么,对kotlin了解多少,kotlin学习多久可以投入开发
- JVM,Dalvik,ART联系与区别
- Appp启动流程(冷启动,热启动,温启动)
- 讲一下View绘制的流程
- 卡顿的根本原因是什么,为什么16ms内绘制工作无法完成
- 事件分发机制
- WebView使用有哪些需要注意的地方,如何处理
- Webview内存泄漏分析
- 如果要开发一个和安全相关的app,需要考虑哪些方面
- 非对称加密算法有哪些,RSA全程
- 非对称加密和对称加密性能比较
- Https加密过程
- JectPack组件了解哪些,谷歌推出jectpack组件的原因
- Jectpack组件使用过程中遇到哪些问题
- 项目中的难点,详细说一下
- 说一下项目中的组件化,为什么这么做
- 为什么对项目进行架构设计
- 如果开发新项目如何设计项目架构
- 项目中有没没有应用tcp,socket等
- 项目中有没有涉及蓝牙及其他硬件相关
- 最近两年的谷歌开发者大会有印象的事件
- 未来几年的规划
- 反问
Z公司 三面
- 自我介绍
- 过往经历
- 对于团队的期待
- 业务方向的职业规划
- 之前的团队状态
- 有挑战性成就感的工作,对自己的影响
- 自己在和同事处事方面的优点
- 自己的不足方面
- 新的技术点
- 自己认为还有哪些个人特点,优缺点
- 反问
HR面(大同小异)
- 自我介绍
- 讲一下有成就感的事情
- 过去的工作经历有哪些地方提升了
- 过去团队的绩效考核方式
- 团队规模
- 对于新团队的一个期望
- 对于面试官的评价
- 目前求职的其他公司进展情况
- 目前薪资,期望薪资
- 大概入职时间
- 反问
总结
上面的面试题在我省略一些项目相关的题目后大家能否感受到,有些题出现的频率很高,无外乎两种:一种是八股,另一个就是简历上所提到的点了。所以针对这两点的应对方案也是简单粗暴,八股必须刷,不解释;针对简历中提到的知识点查找相关博客资料全面系统的进行总结复习,不擅长的不要提! 另外,我个人针对项目经历无亮点的同学一个建议,深入学习某一个Android的优化方向并尝试应用到项目中把它转化成自己的真实项目经历!至于算法,我采用的算是速成的方式,针对性去刷那些高频面试题,即使自己写不出来,也要记住解题思路,思路很重要!以我这段时间的面试情况来看,我算是很幸运的,算法题普遍是在简单级别,而且有些公司并没有考察算法。但是如果想要稳扎稳达,从容不迫应对各种算法的话,除了不断刷题学习思路我觉得没有其他更好地方式了。
以上是我个人的一些拙见,望酌情采纳,最后祝所有想找工作的同学都能收到自己心仪的公司的offer!