Android 及 Java 核心技术面试指南:高频考点与解析
前言
随着互联网行业的快速发展,技术迭代速度日益加快。对于求职者而言,面试不仅是展示技术能力的舞台,更是检验知识体系完整性的试金石。无论市场环境如何变化,企业对于高质量人才的需求始终存在。本文旨在梳理 Android 开发及相关技术领域的高频面试题,涵盖 Java 基础、Android 系统原理、Framework 底层机制、音视频处理、算法数据结构以及 Flutter 跨平台开发等核心内容。
本指南站在招聘者视角出发,从考察问题延伸至知识点详解,并提供回答思路与最佳实践。通过深入理解底层逻辑,帮助开发者在面试中展现扎实的技术功底,从容应对各类挑战。
一、Java 核心基础
1.1 集合框架
Q: HashMap 的底层实现原理是什么?JDK 1.7 和 1.8 有什么区别?
A: HashMap 基于哈希表实现,存储键值对。JDK 1.7 采用数组 + 链表结构,当哈希冲突时,新元素插入链表头部(头插法),可能导致死循环(多线程扩容场景)。JDK 1.8 引入数组 + 链表 + 红黑树结构,当链表长度超过阈值(默认 8)且数组长度超过 64 时,链表转为红黑树,提高查询效率至 O(log n)。同时改为尾插法,避免死循环。扩容机制也进行了优化,支持位运算计算索引。
Q: ConcurrentHashMap 如何实现线程安全?
A: JDK 1.7 使用分段锁(Segment),将数据分成一段一段存储,给每一段数据配一把锁。JDK 1.8 摒弃 Segment,直接使用 Node 数组 + 链表 + 红黑树,利用 CAS(Compare And Swap)+ synchronized 保证并发安全。put 操作时,若节点为空则 CAS 插入,否则加锁更新,粒度更细,性能更高。
1.2 多线程与并发
Q: 线程池的核心参数有哪些?工作流程是怎样的?
A: 核心参数包括 corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(空闲时间)、unit(时间单位)、workQueue(任务队列)、threadFactory(线程工厂)、handler(拒绝策略)。流程:1. 核心线程满前创建核心线程执行;2. 核心线程满后放入队列;3. 队列满后创建非核心线程;4. 非核心线程满后触发拒绝策略。
Q: volatile 关键字的作用是什么?它能保证原子性吗?
A: volatile 保证可见性和有序性,不保证原子性。可见性指修改后立即同步到主内存;有序性指禁止指令重排序。例如单例模式的双重检查锁定(DCL)需要 volatile 防止对象初始化未完成就返回引用。但 i++ 操作不是原子的,volatile 无法解决。
1.3 JVM 内存模型
Q: JVM 内存区域如何划分?哪些区域会发生 OOM?
A: 分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器、本地方法栈。堆存储对象实例,是 GC 主要区域,易发生 OutOfMemoryError。栈存储局部变量和方法调用,溢出为 StackOverflowError。方法区存储类信息、常量,元空间(Metaspace)不足也会 OOM。
Q: 常见的垃圾回收算法有哪些?
A: 标记 - 清除(碎片多)、标记 - 复制(浪费空间)、标记 - 整理(移动对象)。现代 JVM 多用分代收集:新生代用复制算法(Eden/Survivor),老年代用标记 - 整理或标记 - 清除。常用收集器有 Serial、ParNew、Parallel Scavenge、CMS、G1、ZGC。
二、Android 系统原理
2.1 Activity 生命周期
Q: 请描述 Activity 的生命周期及其回调顺序。
A: onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。前台运行时处于 onResume 状态。横屏切换会销毁重建(除非配置了 configChanges)。启动模式(Standard, SingleTop, SingleTask, SingleInstance)影响任务栈行为。onSaveInstanceState 用于保存临时状态,onRestoreInstanceState 恢复。
Q: Context 有哪些类型?区别是什么?
A: Application Context 应用级,生命周期长,适合静态资源;Activity Context 活动级,关联 UI,适合显示 Dialog、Toast。Service Context 服务级。注意不要泄露 Activity Context,避免内存泄漏。
2.2 View 绘制流程
Q: View 的绘制流程是怎样的?measure、layout、draw 分别做什么?
A: 1. Measure:测量宽高,根据父布局约束和自身属性确定大小;2. Layout:确定位置,计算四个角坐标;3. Draw:绘制内容,包括背景、子视图、内容本身。三者在 onDraw 之前依次调用。自定义 View 需重写 onMeasure、onLayout、onDraw。
Q: 什么是 View 的滑动冲突?如何解决?
A: 当嵌套布局中多个控件都需要响应滑动事件时产生冲突。解决方式:1. 外部拦截法(requestDisallowInterceptTouchEvent);2. 内部拦截法(dispatchTouchEvent 配合 consume)。根据业务需求选择,如 RecyclerView 嵌套 ScrollView 通常用内部拦截。
2.3 消息机制
Q: Handler 的工作原理是什么?Looper 和 MessageQueue 的关系?
A: Handler 发送消息,MessageQueue 存储消息,Looper 循环取出消息并分发给 Handler。每个线程有一个 Looper,主线程自动创建。Handler 绑定当前线程 Looper。消息入队后,Looper 无限循环 poll 消息,调用 handleMessage 处理。注意避免 Handler 导致内存泄漏,使用弱引用或 removeCallbacks。
三、Framework 与底层
3.1 Binder 机制
Q: Binder 是什么?为什么 Android 选择它作为 IPC 机制?
A: Binder 是 Android 特有的远程过程调用(RPC)机制,基于 C++ 实现。相比 AIDL 和 Socket,Binder 更高效,支持权限校验,一次传输可传递多个对象句柄。内核驱动层管理进程间通信,用户态提供接口。优势在于性能高、安全性好。
Q: Binder 的架构包含哪些组件?
A: ServiceManager(服务注册中心)、Client(客户端)、Server(服务端)、Binder Driver(内核驱动)。Client 获取 ServiceManager 中的服务句柄,通过 Binder 驱动与服务端通信。涉及 BpBinder、BBinder、IBinder 接口。
3.2 IPC 通信
Q: Android 四大组件之间的通信方式有哪些?
A: 1. Intent:启动 Activity/Service/BroadcastReceiver;2. ContentProvider:共享数据库;3. Messenger:轻量级 AIDL;4. AIDL:复杂数据类型交互;5. Bundle:Intent 携带数据。推荐优先使用 Intent 和 ContentProvider。
四、音视频与性能优化
4.1 音视频基础
Q: 视频编码格式有哪些?H.264 和 H.265 的区别?
A: 常见格式 MP4、MKV、AVI。编码标准 H.264(AVC)、H.265(HEVC)。H.265 压缩率更高,同等画质下体积减半,但计算复杂度大,硬件支持要求高。Android 支持 MediaCodec 进行编解码。
Q: 音频播放流程是怎样的?
A: MediaPlayer 准备数据 -> 设置数据源 -> 准备(prepare)-> 开始(start)-> 播放 -> 暂停/停止。底层涉及 AudioTrack、AudioFlinger、ALSA。注意采样率、声道数匹配。
4.2 性能优化
Q: 如何优化 Android 启动速度?
A: 1. 减少 Application 初始化逻辑;2. 延迟加载非必要组件;3. 异步加载资源;4. 使用 ProfileInstaller 预编译;5. 优化布局层级。监控冷启动耗时,定位瓶颈。
Q: 内存泄漏的常见原因及排查方法?
A: 原因:静态引用 Context、未注销监听器、Handler 持有 Activity 引用、单例生命周期过长。排查:MAT(Memory Analyzer Tool)分析 Dump 文件,LeakCanary 自动检测。确保及时释放资源,使用 WeakReference。
五、算法与数据结构
5.1 常见算法
Q: 快速排序的原理及时间复杂度?
A: 分治思想,选基准值,小于放左,大于放右,递归排序。平均时间复杂度 O(n log n),最坏 O(n^2)。不稳定排序。原地排序,空间复杂度 O(log n)。
Q: 二叉树的遍历方式有哪些?
A: 前序(根左右)、中序(左根右)、后序(左右根)、层序(BFS)。递归实现简单,迭代需用栈或队列。中序遍历可得有序序列(BST)。
5.2 数据结构
Q: 链表与数组的区别?
A: 数组连续内存,随机访问快 O(1),插入删除慢 O(n)。链表离散内存,插入删除快 O(1),随机访问慢 O(n)。双链表支持双向遍历。
Q: 哈希表的冲突解决策略?
A: 开放寻址法(线性探测、二次探测)、链地址法(拉链法)。Android HashMap 用链地址法,JDK 1.8 转红黑树优化长链表。
六、Flutter 跨平台
6.1 架构原理
Q: Flutter 渲染原理是什么?
A: Flutter 自绘引擎 Skia,不依赖原生控件。Widget 树构建 UI,Element 树维护状态,RenderObject 树负责布局绘制。热重载(Hot Reload)直接注入代码更新 Widget 树,保留状态。
Q: StatefulWidget 和 StatelessWidget 的区别?
A: StatelessWidget 不可变,无状态;StatefulWidget 可变,有 State 对象管理生命周期。State 继承 StatefulWidget 的 build 方法,setState 触发重新构建。
结语
技术面试不仅考察知识点的记忆,更看重对原理的理解和应用能力。建议求职者结合项目经验,深入源码阅读,建立完整的知识体系。面对'内卷'环境,持续学习、夯实基础才是突围的关键。希望本指南能为你的求职之路提供帮助,祝早日斩获理想 Offer!


