2023 版 Android 面试指南,涵盖核心技能
Android 面试涉及 Java 基础、集合、多线程、JVM、Android 四大组件、Handler 机制、Binder、AMS 框架、数据结构算法、Kotlin 特性及音视频与 Flutter 知识。文章梳理了常见面试题并提供了参考思路,帮助开发者系统复习,提升面试通过率。

Android 面试涉及 Java 基础、集合、多线程、JVM、Android 四大组件、Handler 机制、Binder、AMS 框架、数据结构算法、Kotlin 特性及音视频与 Flutter 知识。文章梳理了常见面试题并提供了参考思路,帮助开发者系统复习,提升面试通过率。

近年来互联网行业竞争加剧,面试难度显著提升。考察内容不仅涉及表面应用,更深入到底层原理与系统设计。面试机会相对减少,因此准备过程需更加充分。建议不要盲目参加面试,大厂通常会有面试评价记录,过多的差评可能影响后续求职。面试后应及时复盘,整理知识点,查漏补缺。
了解常考的题型和回答思路,建立知识体系框架。
刷 100-200 道经典题目。记住刷题最重要的是理解其思想,不要死记硬背。碰上原题很难,但大多数解题思路是相通的。重点掌握数据结构与常见算法模式。
主要准备最近一家公司所负责的业务和项目:
主导跨团队项目时,如何高效协调各方工作,使用哪些方法保障按时交付。遇到技术或进度困难时,作为负责人如何应对与决策。这块随着经验增加越来越重要。
常见问题包括:
面试最后面试官通常会问有没有想问的。如果不知道问什么,可以询问团队当前负责的业务是什么,主要面临的挑战是什么,这能体现你的思考深度。
抽象类是对类的抽象,可以有构造器,有成员变量,可以有非抽象方法。接口是对行为的抽象,只能有常量(public static final),不能有构造器,Java 8 之前只能有抽象方法,之后可以有默认方法和静态方法。一个类可以实现多个接口,但只能继承一个抽象类。
String 是不可变的字符序列,每次修改都会生成新对象。StringBuffer 是可变的且线程安全(方法加锁)。StringBuilder 是可变的且非线程安全,性能优于 StringBuffer。单线程下推荐用 StringBuilder。
== 比较的是内存地址(基本类型比较值)。equals() 默认比较地址,Object 子类可重写比较内容(如 String)。hashCode() 用于哈希表定位,若重写 equals() 必须重写 hashCode(),保证相等对象的哈希码相同。
浅拷贝只复制对象本身,不复制引用的对象,两者指向同一内存。深拷贝会递归复制所有引用的对象,完全独立。
Error 是 JVM 无法处理的严重错误(如 OutOfMemory),程序无法恢复。Exception 是程序可以处理的异常,分为受检异常(Checked)和非受检异常(Unchecked)。
反射允许在运行时获取类的信息并操作类成员。应用场景包括框架开发(如 Spring IOC)、动态代理、序列化库等。
Java 泛型在编译期进行类型检查,运行时会擦除泛型类型信息,替换为 Object 或边界类型。局限性在于无法获取泛型的实际类型参数,无法创建泛型数组。
安全性(字符串常量大池)、线程安全、Hash 缓存优化、类加载器等。
元数据,用于标记代码,编译器或运行时框架可读取注解进行处理,如@Override, @Deprecated。
List 有序可重复;Set 无序不可重复;Map 键值对存储,Key 唯一。
ArrayList 基于数组,随机访问快,增删慢(需移动元素)。LinkedList 基于双向链表,随机访问慢,增删快(只需修改指针)。
Hashtable 线程安全(全方法加锁),不允许 null 键值,效率低。HashMap 非线程安全,允许 null,效率高。ConcurrentHashMap 是线程安全的高性能替代。
默认容量 10,当元素超过容量时,扩容为原来的 1.5 倍,并重新分配数组。
数组 + 链表 + 红黑树。通过 key 的 hash 值计算索引位置。冲突时链表挂载,链表长度超过阈值转为红黑树。
继承自 HashMap,维护了一个双向链表记录插入顺序或访问顺序。
JDK 1.7 分段锁,JDK 1.8 CAS+synchronized 锁住链表头节点,并发度更高。
继承 Thread 类,实现 Runnable 接口,实现 Callable 接口配合 FutureTask,使用线程池。
新建 (NEW)、就绪 (RUNNABLE)、阻塞 (BLOCKED)、等待 (WAITING)、计时等待 (TIMED_WAITING)、终止 (TERMINATED)。
synchronized 关键字,Lock 接口(ReentrantLock),volatile 关键字,原子类。
死锁产生于循环等待资源。避免方法:按固定顺序获取锁,设置超时时间,使用 Lock.tryLock()
等待 I/O,等待锁,调用 sleep/wait,主动 yield。
start() 启动新线程执行 run()。run() 只是普通方法调用,在当前线程执行。
synchronized 保证原子性和可见性,volatile 只保证可见性和有序性,不保证原子性。
不可变对象,线程封闭,锁保护,ThreadLocal。
提供线程局部变量,每个线程拥有独立副本。原理是 Thread 内部维护 ThreadLocalMap。
notify 唤醒一个等待线程,notifyAll 唤醒所有等待线程。优先用 notifyAll 避免死锁。
ThreadPoolExecutor 核心参数:corePoolSize, maximumPoolSize, keepAliveTime, workQueue, threadFactory, handler。
公平锁/非公平锁,读写锁,重入锁,自旋锁。
sleep 是 Thread 静态方法,不释放锁,指定时间自动恢复。wait 是 Object 方法,释放锁,需 notify 唤醒。
分代收集理论,新生代(Eden, Survivor),老年代。常用算法:标记清除,标记复制,标记整理。
强引用(不被回收),软引用(内存不足回收),弱引用(GC 即回收),虚引用(仅通知回收)。
加载 -> 验证 -> 准备 -> 解析 -> 初始化。双亲委派模型。
JVM 标准 Java 虚拟机。Dalvik 是 Android 早期虚拟机,执行 .dex。ART 是 Android 5.0+ 虚拟机,AOT 编译,启动快但安装慢。
Java 内存模型,定义线程如何操作内存变量,解决可见性、原子性、有序性问题。
Activity 传 Fragment:setArguments。Fragment 传 Activity:回调接口或 EventBus。Fragment 间:通过宿主 Activity 中转。
Standard(默认),SingleTop(栈顶复用),SingleTask(栈内复用),SingleInstance(独占栈)。
Context 是上下文环境,包含资源、配置等。有 Application, Activity, Service 三种,注意避免内存泄漏。
声明组件能响应的 Intent,用于隐式启动,如打开网页、拨打电话。
startService 生命周期独立,停止需 stopService。bindService 绑定服务,随组件销毁而销毁,支持交互。
前台服务,JobScheduler,广播监听,系统级白名单等。
跨进程数据共享,通过 URI 访问数据库或其他数据源。
onPause, onStop, onDestroy, onCreate, onStart, onResume。可配置 configChanges 避免重建。
Binder 限制约 1MB。大数据需使用 FileProvider 或传递路径。
需要后台线程处理耗时任务,自带 Looper,适合长生命周期后台线程。
已废弃,用于处理异步请求,处理完自动停止。
优点:简化异步。缺点:内存泄漏风险,Android 11 已移除。
确保代码在主线程执行,常用于子线程更新 UI。
不能,会导致崩溃。必须通过 Handler 或 runOnUiThread。
MessageQueue 队列,Looper 循环取消息,Handler 发送和处理。主线程有 Looper,子线程无。
子线程没有 Looper,调用 prepare() 即可解决。
Loop 中有 MessageQueue,空闲时进入 native poll 等待,有消息则唤醒。
相邻交换,优化:若一趟无交换则提前结束。
定义 Node 类含 val 和 next,遍历修改指针。
三指针法:prev, curr, next,逐个反转指向。
时间:算法执行时间随输入规模增长。空间:算法占用内存随输入规模增长。
快慢指针,相遇则有环。
自平衡二叉查找树,保证最长路径不超过最短路径两倍,查询 O(log n)。
分治法,选基准,分区递归。优化:三数取中,小数组插排。
数组首尾相接,解决假溢出,需记录 head 和 tail。
先找尾节点,若不同尾则不相交。同尾则分别计数长度差,对齐后遍历。
一次拷贝,高性能,支持跨进程通信,权限控制。
使用 mmap 映射内存,内核态与用户态共享内存区域。
将文件映射到虚拟内存,减少内存拷贝。
通过 ServiceManager 注册服务,Client 获取 Stub 代理,通过 AIDL 接口调用。
AMS, WMS, PMS 等通过 Binder 通信。
同上,受限于 Binder 缓冲区大小。
提供带 Looper 的后台线程,方便使用 Handler 机制。
发送 Message -> 放入 Queue -> Looper 取出 -> Handler 处理。
ThreadLocal 中,每个线程一个。
线程隔离变量。
Main Looper 由 SystemServer 创建,常驻主线程。
通过 Handler.post 发送到目标线程的 Looper。
调用 native pollOnce 阻塞等待消息。
通过 Epoll 机制,有消息触发事件。
从 MessageQueue 头部取出。
管理所有 Activity 的生命周期,初始化在 SystemServer。
ActivityThread 是主线程入口,ApplicationThread 是 Binder 服务端接口。
监控应用行为,用于测试框架。
通过 Socket 或 Binder。
模拟 Activity 注册、启动、销毁流程。
有序数组,左右指针逼近,O(log n)。
单调栈或双指针,计算每个位置能存的水量。
双指针遍历。
双指针覆盖。
中心扩展法或 Manacher 算法。
快速幂算法,取模防止溢出。
贪心,维护最远可达位置。
快慢指针找中点,反转后半段,对比。
蓄水池抽样算法。
栈,左进右出。
异或或哈希表。
见 Java 部分。
数组存储 Key 和 Value,比 HashMap 省内存,适合 int 键。
见 Java 部分。
计算 Hash,定位桶,链表/树插入,扩容重组。
空安全,扩展函数,协程,数据类,Lambda 表达式。
object 关键字,Lazy 懒加载。
crossinline, noinline,编译期展开 Lambda,减少对象创建。
轻量级线程,挂起恢复,节省资源,避免回调地狱。
Any 是顶层父类,Object 是 Java 顶层。Kotlin 中 Any 对应 Java Object。
不支持,需显式转换,保证类型安全。
for, forEach, map, filter 等。
高阶函数,接收 lambda,返回结果,常用于空安全链式调用。
接收 lambda,this 指向 receiver,返回 lambda 结果。
预加载,CDN 加速,降低首帧延迟,HLS/DASH 优化。
高斯滤波,中值滤波,双边滤波。
边缘,角点,纹理,颜色直方图。
concat demuxer 或 filter_complex。
MP4, MKV, FLV, WebM, AAC, MP3, H.264, H.265。
Sequence Header, GOP, Frame。
AVFormatContext, AVCodecContext, AVPacket, AVFrame。
调整缓冲策略,自适应码率,网络 QoS。
软解 CPU 计算,兼容性好。硬解 GPU/专用芯片,效率高发热低。
面向对象,可选类型,Isolate 并发,Hot Reload。
Isolate 机制,独立内存空间,通过 Port 通信。
值传递,但引用类型传递的是引用副本。
热重载,声明式 UI,跨平台,Material/Cupertino 组件。
Widget 配置描述,Element 生命周期管理,RenderObject 布局绘制。
类继承限制时使用,混合功能代码。
BroadcastStream 允许多订阅,正常 Stream 单订阅。
Widget 构建树,State 保存可变数据,Context 访问环境和资源。
Reload 保留状态刷新 UI,Restart 重启应用重置状态。
Platform Channel,MethodChannel 调用原生代码。
Provider, Riverpod, Bloc 等,解决组件间数据共享和 UI 更新问题。
面试不仅是知识的考察,更是思维逻辑与沟通能力的体现。建议结合上述知识点,针对自身项目经历进行深入梳理,形成自己的回答体系。持续学习新技术,保持对底层原理的探索,才能在激烈的竞争中脱颖而出。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online