Java/Kotlin基础核心考点
在Android面试中,Java和Kotlin的基础知识是必问环节。面试官通常会考察你对面向对象编程的理解、集合框架的使用以及Kotlin特有语法特性的掌握程度。
1. Java基础重点
面向对象三大特性
封装、继承、多态是Java的核心。面试常问多态的实现原理(方法重写、向上转型)及静态绑定与动态绑定的区别。
集合框架详解
HashMap的底层实现(数组+链表+红黑树)、扩容机制、线程安全问题(ConcurrentHashMap)是高频考点。
异常处理机制
Checked Exception与Runtime Exception的区别,try-with-resources语法,以及自定义异常的最佳实践。
2. Kotlin语法特性
Kotlin作为Android官方推荐语言,其特性是面试的重点。以下是关键知识点对比:
| 特性 | Java | Kotlin | 面试要点 |
|---|---|---|---|
| 空指针安全 | 需手动判空 | Type Safety (?) 和 !! | 理解可空类型与非空类型在编译期的检查机制 |
| 扩展函数 | 不支持 | 支持 | 扩展函数是静态方法,不修改原类结构 |
| 数据类 | 需手写toString/equals | data class | 自动生成getter/setter/toString/equals/hashCode |
| 协程 | 需使用第三方库 | 内置支持 | 理解协程的挂起与恢复机制,suspend关键字 |
3. 常见面试题示例
- 问题:请解释Kotlin中的lateinit和by lazy的区别?
答案:lateinit用于延迟初始化非空变量,只能在非基本类型上使用,且必须在构造函数外初始化;by lazy用于延迟计算属性值,支持线程安全策略(默认线程安全),适用于基本类型和非基本类型。 - 问题:HashMap在多线程环境下为什么不安全?
答案:在JDK1.7中,多线程扩容可能导致环形链表,造成CPU100%;在JDK1.8中,虽然解决了环形链表问题,但仍然存在数据覆盖和丢失的问题,因为put和resize操作不是原子的。
Android框架核心机制
深入理解Android系统框架是进阶高级开发的必经之路。Handler消息机制、View绘制流程、Activity启动流程是三大核心支柱。
Handler消息机制原理
Handler机制由四个核心组件组成:Handler、Message、MessageQueue和Looper。
// Handler发送消息
handler.sendMessage(message);
// Looper循环取消息
while (true) {
Message msg = queue.next(); // 可能阻塞
if (msg != null) {
msg.target.dispatchMessage(msg); // 分发给Handler
msg.recycle();
}
}
关键点:Looper.loop()是一个死循环,如果消息队列为空,线程会阻塞。主线程(UI线程)在Application启动时会自动创建Looper,因此可以在主线程中直接使用Handler更新UI。子线程默认没有Looper,需要手动调用Looper.prepare()和Looper.loop()。
View绘制流程
View的绘制从DecorView开始,经过measure、layout、draw三个阶段。
- Measure:确定View的尺寸。通过onMeasure方法,递归测量子View。MeasureSpec由specSize和specMode组成,specMode包括EXACTLY、AT_MOST和UNSPECIFIED。
- Layout:确定View的位置。通过onLayout方法,父View决定子View的左上右下四个坐标值。
- Draw:绘制View的内容。通过onDraw方法,将View绘制到Canvas上。包括背景、内容、子View(dispatchDraw)、滚动条(onDrawScrollBars)。
面试题:为什么不能在子线程更新UI?
答案:因为ViewRootImpl的checkThread()方法会检查当前线程是否为主线程。此外,View的绘制流程涉及大量的线程同步操作,子线程更新UI可能导致竞态条件和界面显示异常。
Activity启动流程
Activity的启动涉及多个进程间的通信(Binder机制)。
核心类:ActivityManagerService (AMS), ActivityThread, ApplicationThread, Instrumentation。
Android架构设计与最佳实践
现代Android应用开发强调模块化、组件化和可维护性。MVC、MVP、MVVM是常见的架构模式,而Jetpack组件则是实现MVVM的有力工具。
1. 架构模式对比
| 模式 | 特点 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| MVC | Model-View-Controller | 简单直观 | View层过重,Controller臃肿 | 小型项目 |
| MVP | Model-View-Presenter | View薄,逻辑在Presenter | 接口多,维护成本高 | 中型项目 |
| MVVM | Model-View-ViewModel | 数据双向绑定,UI自动更新 | 调试困难,学习曲线陡 | 大型项目,复杂UI |
2. Jetpack核心组件
- Lifecycle:管理Activity和Fragment的生命周期,避免内存泄漏。
- LiveData:可观察的数据持有类,遵循生命周期,确保UI与数据同步。
- ViewModel:存储界面相关数据,配置更改(如屏幕旋转)后数据不丢失。
- Room:SQLite对象映射库,简化数据库操作,编译期检查SQL语句。
- Navigation:处理Fragment之间的导航,支持深链接和动画。
3. 模块化与组件化
随着项目规模扩大,单体应用难以维护。组件化架构将应用拆分为多个独立模块,每个模块可以独立开发、测试和运行。核心模块提供公共能力,业务模块实现具体功能。通过ARouter等路由框架实现模块间解耦通信。
Android性能优化实战
性能优化是高级工程师面试的必考题。优化涉及启动速度、内存管理、UI流畅度、网络请求和电量消耗等多个方面。
1. 启动优化
启动时间分为冷启动和热启动。冷启动需要创建进程和Application,耗时较长。优化策略包括:
- 异步初始化:将非必要的第三方SDK初始化推迟到主线程空闲时进行。
- 减少Application逻辑:避免在Application中执行耗时操作。
- 延迟加载:首页非关键资源(如广告、统计)延迟加载。
2. 内存优化
内存泄漏是Android开发中的常见问题。常见泄漏点包括:
| 泄漏场景 | 原因 | 解决方案 |
|---|---|---|
| 静态变量持有Activity | 静态变量生命周期长,持有Activity引用 | 使用Application Context或弱引用 |
| 内部类/匿名内部类 | 隐式持有外部类引用 | 使用静态内部类+弱引用,或改为静态类 |
| 资源未关闭 | Cursor、InputStream等未close | 使用try-with-resources或finally块关闭 |
| Handler消息队列 | Handler持有Activity引用,消息未处理 | 移除回调,使用弱引用Context |
3. UI流畅度优化
掉帧是用户感知最明显的性能问题。优化手段包括:
- 减少布局层级:使用ConstraintLayout替代嵌套LinearLayout/RelativeLayout。
- 优化Drawable:使用Vector Drawable,避免使用9-patch大图。
- 异步加载:图片加载使用Glide/Picasso,避免在主线程解码大图片。
- RecyclerView优化:设置固定大小、使用DiffUtil、避免在onBindViewHolder中执行耗时操作。
大厂高频面试题解析
以下是来自字节跳动、腾讯、阿里等大厂的真实面试题目,涵盖深度和广度。
1. 字节跳动
问题:请简述Android中的Binder机制原理。
解析:Binder是Android特有的IPC机制。它基于C/S架构,内核空间有Binder驱动程序,用户空间有ServiceManager、Server和Client。Binder通过mmap映射内存,实现零拷贝。Client通过Proxy对象发起调用,请求发送给Binder驱动,驱动转发给Server,Server处理后将结果返回。Binder的优势是安全、高效、支持多进程。
2. 腾讯
问题:Kotlin协程与RxJava相比有什么优势?
解析:协程是轻量级线程,由用户态调度,切换成本低;RxJava基于观察者模式,链式调用复杂,调试困难。协程支持挂起函数,代码同步风格,可读性更好。协程与Kotlin语言深度集成,支持结构化并发,避免内存泄漏。
3. 阿里
问题:如何设计一个高可用的Android网络请求库?
解析:需要考虑以下方面:1. 线程池管理:避免创建过多线程;2. 缓存策略:内存+磁盘+网络三级缓存;3. 重试机制:网络抖动时自动重试;4. 拦截器链:日志、签名、加密等横切关注点;5. 错误处理:统一异常封装;6. 取消请求:防止内存泄漏。
Android开发者职业规划指南
随着Flutter、React Native等跨平台技术的兴起,Android原生开发面临挑战,但仍有不可替代的价值。以下是不同阶段的职业发展建议。
1. 初级阶段(0-2年)
重点掌握Java/Kotlin基础、Android常用API、UI布局、Intent、BroadcastReceiver、ContentProvider等。能够独立完成简单APP开发。
2. 中级阶段(2-5年)
深入理解Android框架源码,掌握性能优化、内存管理、自定义View、组件化开发。熟悉Jetpack组件,能够搭建MVVM架构。
3. 高级阶段(5年以上)
具备架构设计能力,能够主导大型项目技术选型。关注跨平台技术(Flutter/RN)、AOP、插件化、热修复等前沿技术。具备团队管理和技术规划能力。
建议:保持学习热情,关注Google I/O大会,阅读官方文档,参与开源项目,积累技术博客写作经验。