Android 中高级技术面试核心考点与解析
前言
大厂面试通常包含三个关键维度:心态调整、技术要求与知识储备。在竞争激烈的求职环境中,保持自信并展现扎实的技术硬实力至关重要。面试官不仅关注简历上的项目经验,更考察对底层原理的理解及解决复杂问题的能力。以下内容整理了 Java 基础、Android 核心机制、系统架构及性能优化等高频考点,旨在帮助开发者系统复习。
一、Java 基础与 JVM
1. HashMap 原理与实现
HashMap 是 Java 集合框架中最常用的数据结构之一,基于数组 + 链表 + 红黑树实现。
- 底层结构:JDK 1.7 为数组 + 链表(头插法),JDK 1.8 改为数组 + 链表 + 红黑树(尾插法)。
- Hash 冲突:当不同 Key 的 Hash 值映射到同一索引位置时发生。解决方式包括链地址法(链表/红黑树)、开放寻址法等。HashMap 采用链地址法。
- 容量与扩容:容量必须是 2 的 n 次方,便于通过位运算计算索引。默认初始容量 16,负载因子 0.75。当元素数量超过
容量 * 负载因子时触发扩容,新容量为旧容量的 2 倍。 - 线程安全:HashMap 非线程安全。多线程环境下建议使用 ConcurrentHashMap。
- 红黑树转换:当链表长度超过阈值 8 且数组长度大于 64 时,链表转为红黑树;反之若红黑树节点数小于 6,则退化为链表。这是为了平衡查找效率与空间开销。
2. ArrayList 与 LinkedList
- ArrayList:基于动态数组实现。支持随机访问(O(1)),但插入删除需移动元素(O(n))。适合读多写少场景。
- LinkedList:基于双向链表实现。不支持随机访问,但插入删除只需修改指针(O(1),已知位置)。适合频繁增删场景。
- 源码分析:ArrayList 的
add方法涉及数组扩容逻辑;get/set直接通过下标访问内存。
3. HashSet 源码
HashSet 底层实际上是 HashMap 的封装。Key 作为 HashMap 的 Key,Value 使用一个固定的 Object 对象(PRESENT)作为 Value。因此 HashSet 不允许重复元素,其去重依赖于 HashMap 的 Key 唯一性。
4. 内存模型与垃圾回收 (JVM)
- JVM 内存区域:分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器、本地方法栈。堆存储对象实例,栈存储局部变量和方法调用。
- 类加载机制:加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载。双亲委派模型确保核心类库的安全性,避免核心 API 被篡改。
- GC 算法:包括标记 - 清除、复制、标记 - 整理、分代收集。新生代使用复制算法,老年代使用标记 - 整理或标记 - 清除。
- Dalvik vs ART:Dalvik 使用即时编译(JIT),ART 使用提前编译(AOT),ART 启动快但安装慢,内存占用更高。
5. 多线程与并发
- 创建方式:继承 Thread、实现 Runnable、实现 Callable、使用线程池。
- 状态:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。
- 同步机制:synchronized 关键字(隐式锁)和 Lock 接口(显式锁)。volatile 保证可见性和有序性,但不保证原子性。
- 线程池参数:corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler。
- 死锁避免:破坏循环等待条件,如按顺序获取锁。


