Android 面试核心知识点汇总
本文整理了 Android 开发岗位面试中常见的 32 个核心模块,涵盖 Java 基础、集合、多线程、虚拟机、Android 组件、Framework、算法及音视频等领域。旨在帮助开发者系统复习关键技术点。
Java 方面
Java 基础部分
抽象类与接口的区别? 抽象类可以有构造方法、成员变量和方法实现;接口只能有常量(public static final)和抽象方法(Java 8 后可有 default/static 方法)。抽象类用于代码复用,接口用于定义规范。
分别讲讲 final,static,synchronized
final:修饰类不可继承,修饰方法不可重写,修饰变量不可变。static:属于类而非实例,内存中只有一份,可通过类名直接访问。synchronized:用于线程同步,保证临界区代码的原子性。
请简述一下 String、StringBuffer 和 StringBuilder 的区别?
String:不可变字符序列,每次修改生成新对象。StringBuffer:可变,线程安全,性能较低。StringBuilder:可变,非线程安全,性能较高。
'equals'与'=='、'hashCode'的区别和使用场景?
==:比较基本类型值或引用地址。equals():默认比较地址,Object 子类常重写比较内容(如 String)。hashCode():哈希码,配合 HashMap 使用。若 equals 相等,hashCode 必须相等。
Java 中深拷贝与浅拷贝的区别?
- 浅拷贝:复制对象本身,内部引用类型指向同一内存地址。
- 深拷贝:递归复制所有层级,完全独立的新对象。
谈谈 Error 和 Exception 的区别?
Error:严重错误,JVM 无法处理(如 OutOfMemory),通常不捕获。Exception:程序可处理的异常,分为受检(Checked)和非受检(Unchecked)。
什么是反射机制?应用场景?
- 运行时动态获取类信息并操作对象。应用:框架设计(Spring)、动态代理、序列化。
谈谈如何重写 equals() 方法?为什么还要重写 hashCode()?
- 重写 equals 需满足自反、对称、传递、一致性、非空性。重写 hashCode 是为了保证在 HashMap/HashSet 中正确存储和检索,避免哈希冲突导致数据丢失。
谈谈你对 Java 泛型中类型擦除的理解,局限性?
- 编译后泛型信息被擦除为原始类型。局限:无法判断具体泛型类型,无法创建泛型数组。
说说你对 Java 注解的理解?
- 元数据,提供额外信息给编译器或运行时。常见:@Override, @Deprecated, @SuppressWarnings。
Java 集合
List, Set, Map 的区别?
- List:有序,可重复,索引访问。
- Set:无序(HashSet),不可重复。
- Map:键值对,Key 唯一。
ArrayList 和 LinkedList 的区别?
- ArrayList:基于数组,随机访问快,增删慢。
- LinkedList:基于双向链表,增删快,随机访问慢。
HashMap 与 HashTable 的区别?
- HashMap:非线程安全,允许 null 键值,速度快。
- HashTable:线程安全,不允许 null,速度慢。
ArrayList 的扩容机制?
- 默认容量 10,超过时扩容为原容量的 1.5 倍,并复制数组。
HashMap 的实现原理?
- 数组 + 链表 + 红黑树(JDK 1.8+)。Hash 冲突时链表挂载,长度超阈值转红黑树。
LinkedHashMap 的工作原理?
- 维护双向链表记录插入顺序或访问顺序,支持 LRU 缓存实现。
ConcurrentHashMap 的理解?
- JDK 1.7 分段锁,JDK 1.8 CAS+synchronized,保证高并发下读写效率。
Java 多线程
Java 中使用多线程的方式?
- 继承 Thread 类,实现 Runnable 接口,实现 Callable 接口配合 FutureTask,使用线程池。
线程的几种状态?
- NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。
如何实现多线程中的同步?
- synchronized, Lock, volatile, Semaphore, CountDownLatch 等。
线程死锁及避免?
- 资源循环等待。避免:固定顺序加锁,超时尝试,死锁检测。
线程阻塞的原因?
- 等待 I/O,等待锁,sleep/wait,CPU 调度。
Thread run() 与 start() 的区别?
- start() 启动新线程执行 run();run() 只是普通方法调用。
synchronized 和 volatile 的区别?
- synchronized 保证原子性和可见性,volatile 仅保证可见性和禁止指令重排。
如何保证线程安全?
- 不可变对象,线程封闭,互斥锁,无锁编程。
ThreadLocal 用法和原理?
- 每个线程拥有独立副本。原理:Thread 类持有 ThreadLocalMap。
notify 和 notifyAll 区别?
- notify 唤醒一个等待线程,notifyAll 唤醒所有。
什么是线程池?如何创建?
- 管理一组线程复用。通过 Executors 工厂类或 ThreadPoolExecutor 创建。
java 线程常见的几种锁?
- 乐观锁,悲观锁,公平锁,非公平锁,读写锁,可重入锁。
sleep() 和 wait() 的区别?
- sleep 是 Thread 静态方法,不释放锁;wait 是 Object 方法,释放锁。
Java 虚拟机
JAVA 垃圾回收机制?
- 自动管理内存,区分新生代/老年代,标记清除、复制、标记整理等算法。
强、软、弱、虚引用区别?
- 强引用:常驻内存;软引用:内存不足回收;弱引用:GC 即回收;虚引用:无法访问,仅通知回收。
JVM 类的加载机制?
- 加载、验证、准备、解析、初始化。双亲委派模型。
JVM、Dalvik、ART 三者区别?
- JVM:标准 Java SE;Dalvik:Android 早期,解释执行;ART:Android 4.4+,AOT 预编译。
JMM 是什么?问题及解决?
- Java 内存模型。问题:可见性、原子性、有序性。解决:volatile, synchronized, final。
Android 方面
四大组件
Activity 与 Fragment 通信方式?
- Activity 传参,Interface 回调,EventBus,ViewModel/LiveData。
LaunchMode 应用场景?
- standard:默认;singleTop:栈顶复用;singleTask:任务栈复用;singleInstance:独立栈。
Context 了解多少?
- Application, Activity, Service Context。注意内存泄漏风险,优先用 ApplicationContext。
IntentFilter 及使用场景?
- 声明组件能响应的 Action/Category/Data。用于隐式 Intent 跳转。
startService 和 bindService 区别?
- startService:生命周期独立,服务可能存活;bindService:绑定关系,断开销毁。
Service 保活?
- 前台服务,JobScheduler,系统广播监听,多进程守护。
ContentProvider 数据共享?
- 统一接口,URI 匹配,权限控制,跨进程数据访问。
横竖屏切换 Activity 生命周期?
- onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume。
Intent 传输数据限制?
- Binder 限制约 1MB。大数据走 FileProvider 或临时文件。
Android 异步任务和消息机制
HandlerThread 用法?
- 自带 Looper 的后台线程,适合需要消息队列的场景。
IntentService 应用?
- 自动创建 HandlerThread,处理完任务自动停止,适合一次性后台任务。
AsyncTask 优缺点?
- 优点:简单;缺点:内存泄漏,生命周期难控,已废弃。
子线程能否更新 UI?
- 不能。Android UI 线程模型要求主线程更新界面。
Handler 机制原理?
- MessageQueue, Looper, Handler。消息入队,Looper 轮询分发。
子线程创建 Handler 抛异常原因?
- 子线程没有 Looper,需先 prepare。
Loop 死循环为何不阻塞?
- 进入 native pollOnce 等待事件,有消息才返回。
数据结构
冒泡排序及优化?
- 相邻交换。优化:设置标志位,若一轮无交换则结束。
单链表实现?
- Node 类含 data 和 next 引用,头插法或尾插法构建。
反转单链表?
- 三指针法:prev, curr, next 迭代交换指向。
时间/空间复杂度?
- 衡量算法效率。O(1), O(log n), O(n), O(n^2) 等。
判断链表成环?
- 快慢指针,相遇则有环。
红黑树?
- 自平衡二叉查找树,保证最坏情况 O(log n)。HashMap 底层结构。
快速排序及优化?
- 分治法。优化:三数取中,小数组用插入排序。
循环队列?
- 数组模拟,首尾相接,解决假溢出。
判断单链表交叉?
- 计算长度差,对齐后遍历比较节点地址。
Android Framework
Binder
Binder 优势?
- 一次拷贝,跨进程高效,安全性高。
一次拷贝原理?
- 内核态与用户态共享内存映射,减少数据拷贝次数。
MMAP 原理?
- 内存映射,将文件映射到虚拟地址空间。
Binder 跨进程?
- 通过 ServiceManager 注册服务,Client 获取 Stub 代理,通过 IPC 通道通信。
四大组件通信?
- 主要依赖 Binder 机制进行进程间通信。
Intent 大数据限制?
- 同上,走 Binder 限制,大数据需文件化。
Handler
HandlerThread 存在原因?
- 提供带 Looper 的线程,简化后台消息处理。
Looper 存在哪?
- 每个线程一个。Main Looper 在主线程。
ThreadLocal 作用?
- 线程隔离变量,确保线程私有。
Main Looper 与一般 Looper 异同?
- 功能相同,Main Looper 负责 UI 事件分发。
Looper loop() 为什么不卡死?
- 调用 native pollOnce 阻塞等待消息。
Message 获取?
- 从 MessageQueue 取出,按优先级和时间戳排序。
AMS
AMS 是什么?
- ActivityManagerService,系统核心服务,管理 Activity/Service/Window。
ActivityThread/ApplicationThread?
- ActivityThread 是 App 主线程入口;ApplicationThread 是 Binder 服务端接口。
Instrumentation?
- 监控应用与系统交互,测试框架基础。
ActivityRecord/TaskRecord?
- 记录 Activity 和 Task 的状态信息,AMS 内部管理结构。
手写简化版 AMS?
- 涉及 Binder 通信,状态机管理,进程调度逻辑。
算法方面
二分查找?
- 有序数组查找,O(log n),注意边界条件。
接雨水问题?
- 单调栈或双指针,计算每个位置左右最大值差值。
最长回文子串?
- 中心扩展法或 Manacher 算法。
去除有序数组重复元素?
- 双指针,覆盖重复项。
模幂运算?
- 快速幂算法,结合取模防止溢出。
跳跃游戏?
- 贪心算法,维护最远可达距离。
回文链表?
- 快慢指针找中点,反转后半段,对比前后半段。
随机抽取元素?
- 蓄水池抽样算法。
括号合法性?
- 栈结构,左进右出,最后栈空且匹配。
缺失和重复元素?
- 数学求和或位运算,或原地置换。
SparseArray 原理?
- 数组存储 key-value,比 HashMap 节省内存,适合 int key。
ConcurrentHashMap 线程安全?
- CAS + synchronized,分段锁或桶锁。
HashMap put 冲突?
- 链表遍历比较 key,一致覆盖,不一致追加,转红黑树。
Kotlin 方面
Kotlin 特性?
- 空安全,协程,扩展函数,数据类,Lambda 等。
单例实现?
- object 关键字,Companion Object。
内联函数?
- inline + lambda,消除闭包开销,提升性能。
Coroutines vs 线程?
- 协程轻量级,挂起恢复,无需线程切换开销。
Any 与 Object?
- Any 是顶层类,Object 是 Java 顶层类,Kotlin 中 Any 对应 Java Object。
隐式转换?
- 有,如 Int 转 Long,但需注意精度损失。
集合遍历?
- for, forEach, map, filter 等。
let 原理?
- Lambda 接收 this,返回 Lambda 结果。
run 原理?
- Lambda 接收 this,返回 Lambda 最后一个表达式结果。
音视频方面
直播秒开优化?
- 预加载,关键帧策略,CDN 加速,首屏渲染优化。
图像滤波?
- 均值滤波,高斯滤波,中值滤波。
图像特征?
- 边缘,角点,纹理,颜色直方图。
FFmpeg 合成视频?
- ffmpeg -i input.jpg -loop 1 -c:v libx264 output.mp4。
音视频格式?
- MP4, MKV, FLV, HLS, DASH。
MPEG 码流结构?
- 序列头,GOP,P 帧,B 帧。
降低延迟?
- 减小缓冲,优化编码参数,网络协议优化(QUIC/WebRTC)。
软解硬解?
- 软解:CPU 解码;硬解:GPU/专用芯片解码。
Flutter 方面
Dart 特性?
- 面向对象,可选类型,异步编程,Hot Reload。
Dart 并行?
- Isolate 实现真正并行,避免 GC 停顿。
值传递还是引用?
- 值传递,但对象引用也是值传递。
Flutter 特性?
- 跨平台,热重载,声明式 UI。
Widget/Element/RenderObject?
- Widget 配置,Element 状态管理,RenderObject 布局绘制。
Mixins 条件?
- 类未继承其他 Mixin,符合单一职责。
Stream 订阅模式?
- listen (一次性), asBroadcastStream (多订阅)。
Widget/State/Context?
- Widget 蓝图,State 状态,Context 上下文环境。
Hot Reload/Restart?
- Reload:保留状态注入代码;Restart:重启应用。
Flutter 与原生通信?
- Platform Channel,MethodChannel,EventChannel。
状态管理?
- Provider, Riverpod, Bloc 等。解决 Widget 重建频繁问题。
注:以上内容为技术要点梳理,实际面试中需结合项目经验深入阐述。


