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,避免内存泄漏。


