金九银十 Android 面试高频真题集
前言
随着移动互联网技术的快速发展,Android 开发岗位的需求依然旺盛,但竞争也日益激烈。在'金九银十'的招聘旺季,面试官不仅关注候选人的编码能力,更看重对底层原理的理解、系统架构的掌握以及解决复杂问题的思路。本文整理了一份涵盖 Java 基础、Android 核心组件、Framework 源码、算法数据结构、Kotlin 特性及音视频处理的全方位面试题集,旨在帮助开发者梳理知识体系,查漏补缺。
本资料共分为多个核心模块,每个模块均包含高频考点及关键知识点解析,建议结合官方文档与源码进行深入研读。
一、Java 基础篇
Java 是 Android 开发的基石,深入理解 Java 语言特性对于编写高性能代码至关重要。
1. Java 基础核心
- 抽象类与接口的区别:接口侧重行为规范,支持多实现;抽象类侧重代码复用,有状态字段。
- 关键字辨析:
final修饰类不可继承、方法不可重写、变量不可变;static表示静态成员,属于类而非实例;synchronized用于线程同步,保证原子性。 - String 类型:String 设计为不可变对象,保证了安全性(如哈希缓存)和线程安全。String、StringBuffer 和 StringBuilder 的区别在于可变性与线程安全。
- equals 与 hashCode:重写 equals 必须重写 hashCode,否则影响 HashMap 等集合的查找效率。
- 深浅拷贝:浅拷贝只复制引用,深拷贝复制对象本身。需手动实现或借助序列化/克隆。
- Error 与 Exception:Error 是 JVM 无法恢复的错误(如 OOM),Exception 是程序可处理的异常。
- 反射机制:运行时动态获取类信息并操作对象,常用于框架开发(如依赖注入)。注意性能开销。
- 泛型与注解:泛型通过类型擦除实现,存在局限性;注解用于元数据标记,配合反射使用。
2. Java 集合框架
- List, Set, Map 区别:List 有序可重复;Set 无序不重复;Map 键值对存储。
- ArrayList vs LinkedList:ArrayList 基于数组,随机访问快;LinkedList 基于链表,插入删除快。
- HashMap 原理:数组 + 链表 + 红黑树。JDK 1.8 后冲突链表长度超过 8 转为红黑树,提升查询效率至 O(logN)。
- 扩容机制:默认容量 16,负载因子 0.75,达到阈值触发扩容,容量翻倍。
- ConcurrentHashMap:JDK 1.7 分段锁,JDK 1.8 CAS+synchronized,保证高并发下的线程安全。
3. Java 多线程与并发
- 线程创建:继承 Thread、实现 Runnable、Callable 配合 FutureTask、线程池。
- 线程状态:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。
- 同步与锁:synchronized 内置锁,ReentrantLock 显式锁。volatile 保证可见性与禁止指令重排,但不保证原子性。
- 死锁避免:破坏循环等待条件,按顺序加锁,设置超时时间。
- 线程池:ThreadPoolExecutor 核心参数包括 corePoolSize, maximumPoolSize, keepAliveTime 等。避免使用 Executors 直接创建,防止 OOM。
- ThreadLocal:线程隔离变量,需注意内存泄漏问题,调用 remove() 清理。
- notify vs notifyAll:notify 唤醒一个等待线程,notifyAll 唤醒所有,后者更安全。
- sleep vs wait:sleep 保持锁,wait 释放锁。
4. Java 虚拟机 (JVM)
- 垃圾回收机制:分代收集理论,新生代(Eden/Survivor)与老年代。GC 算法包括标记清除、复制、标记整理。
- 引用类型:强引用(最常用)、软引用(内存不足时回收)、弱引用(GC 即回收)、虚引用(监控对象回收)。
- 类加载机制:加载、验证、准备、解析、初始化。双亲委派模型确保核心类库安全。
- JVM 演进:JVM (HotSpot), Dalvik (字节码解释执行), ART (AOT 编译优化启动速度)。
- JMM (Java 内存模型):定义线程间如何通信,解决可见性、原子性、有序性问题。
二、Android 核心篇
1. 四大组件
- Activity 与 Fragment 通信:Interface 回调、BroadcastReceiver、EventBus、ViewModel+LiveData。
- LaunchMode:Standard, SingleTop, SingleTask, SingleInstance。控制 Activity 栈行为。
- Context 类型:Application, Activity, Service。注意 Context 泄露风险,优先用 Application。
- IntentFilter:声明 Intent 匹配规则,用于隐式跳转。
- Service 生命周期:startService 独立运行,bindService 绑定服务。保活手段包括前台服务、JobScheduler 等。
- ContentProvider:跨应用数据共享标准,基于 URI 权限管理。
- 屏幕切换:横竖屏切换会销毁重建 Activity,可通过配置
configChanges避免。 - Intent 传参限制:Binder 传输大小有限制(约 1MB),大数据建议使用 FileProvider 或 ContentProvider。
2. 异步任务与消息机制
- HandlerThread:带 Looper 的子线程,适合后台耗时任务。
- IntentService:自动处理队列请求,完成后自动停止。
- AsyncTask:已废弃,因生命周期管理困难且不支持多线程并发。
- UI 更新:子线程严禁直接更新 UI,需通过 Handler 或 runOnUiThread。
- Handler 原理:MessageQueue 单向链表,Looper 死循环取出 Message 分发。主线程 Looper 非阻塞是因为 IO 事件驱动。
- 子线程创建 Handler 异常:子线程未调用 Looper.prepare(),导致无 MessageQueue。
- Loop 死循环:通过 native 层 epoll_wait 等待事件,非 CPU 忙等。
3. 数据结构与算法
- 排序算法:冒泡(O(n^2))、快速排序(O(nlogn))、归并排序。优化方向包括三路快排、小数组插排。
- 链表操作:反转链表需调整指针指向;判断环使用快慢指针。
- 红黑树:自平衡二叉搜索树,保证最坏情况 O(logn),HashMap 底层结构。
- 循环队列:解决普通队列空间浪费问题,头尾指针取模运算。
- 链表交叉:双指针法,计算长度差后对齐遍历。
三、Android Framework 篇
1. Binder 机制
- 优势:一次拷贝,跨进程通信效率高,支持 AIDL 接口。
- 零拷贝原理:mmap 映射内核缓冲区,用户态与内核态共享内存。
- 跨进程通信:Client -> Service Manager -> Server。通过 Proxy 和 Stub 实现。
- 四大组件通信:ActivityManagerService 通过 Binder 管理组件生命周期。
2. Handler 机制深度
- Looper 存在位置:ThreadLocal 中存储,主线程初始化,子线程默认无。
- Main Looper:负责处理 UI 事件,优先级高。
- 线程切换:通过 Handler.sendMessage 将消息投递到目标线程的 MessageQueue。
- 消息获取:next() 方法阻塞等待,native 层 epoll 监听文件描述符。
3. AMS (ActivityManagerService)
- AMS 作用:系统核心服务,管理所有应用进程与组件生命周期。
- ActivityThread:应用主线程入口,持有 WindowToken 等。
- Instrumentation:连接测试框架与应用,监控 Activity 生命周期。
- Zygote 通信:AMS 通过 Socket 与 Zygote 交互启动新进程。
- 核心记录:ActivityRecord, TaskRecord, ActivityStack 构成任务栈结构。
- 手写简化 AMS:理解 Binder 注册、进程启动流程、组件调度逻辑。
四、Kotlin 语言篇
- Kotlin 特性:空安全、扩展函数、协程、Lambda 表达式、Data Class。
- 单例模式:object 关键字声明,懒加载,线程安全。
- 内联函数:inline + lambda,减少闭包对象创建,提升性能。
- 协程 (Coroutines):轻量级线程,基于挂起函数,比线程更高效,适合 I/O 密集型任务。
- Any vs Object:Any 是所有类的超类,Object 是具体类。
- 隐式转换:Kotlin 严格类型检查,无隐式数值转换,避免精度丢失。
- 集合遍历:for 循环、forEach、map、filter 等高阶函数。
- let/run 原理:let 返回 lambda 结果,run 返回 lambda 内部最后表达式,this 指向接收者。
五、音视频与 Flutter 篇
1. 音视频技术
- 直播秒开:预加载、CDN 加速、首帧优化。
- 图像滤波:高斯模糊、均值滤波、边缘检测。
- FFmpeg:强大的多媒体框架,支持编解码、格式转换、滤镜处理。
- 码流结构:MPEG 包含视频流、音频流、时间戳等。
- 软解与硬解:CPU 解码通用性强,GPU 解码功耗低速度快。
- 延迟优化:减小缓冲、优化网络协议(QUIC/WebRTC)。
2. Flutter 框架
- Dart 特性:JIT/AOT 混合编译,Null Safety,异步编程。
- 并行模型:Isolate 隔离内存,类似多线程,避免 GC 停顿。
- Widget 树:Widget 描述 UI,Element 维护状态,RenderObject 负责布局绘制。
- Mixins:复用代码块,替代多重继承。
- Stream 订阅:listen 一次性或持续监听,cancel 取消订阅。
- 热重载 (Hot Reload):注入新代码并刷新 UI,保留状态;热重启 (Hot Restart) 重置状态。
- 原生通信:Platform Channel 传递数据,MethodChannel 调用方法。
- 状态管理:Provider, Riverpod, Bloc 等,解决 Widget 间数据共享问题。
六、面试准备建议
- 基础为王:不要忽视 Java/Kotlin 基础,这是区分初级与高级开发的关键。
- 源码阅读:尝试阅读 Handler、View 测量、AMS 等核心源码,理解设计思想。
- 项目复盘:清晰阐述个人项目的难点、解决方案及优化成果。
- 算法训练:坚持 LeetCode 刷题,重点掌握链表、树、动态规划。
- 模拟面试:进行全真模拟,锻炼表达逻辑与抗压能力。
注:本文档仅供学习参考,实际面试中请结合具体岗位要求灵活应对。祝各位开发者顺利拿到心仪 Offer!


