Android 校招面试经验总结
本文整理自字节跳动等大厂 Android 校招面试复盘,涵盖 Java 基础、并发编程、JVM、Android 核心机制及算法题。重点解析了类加载、GC、Binder、Handler 等高频考点,并补充了常见算法解题思路与系统设计要点,适合求职者复习参考。
一面:基础与框架
1. Java 基础
- final 关键字
- 修饰变量:基本类型值不可变;引用类型指向的地址不可变(对象内容可变)。
- 修饰方法:方法不可被重写。
- 修饰类:类不可被继承。
- 类加载机制
- 过程:加载 -> 验证 -> 准备 -> 解析 -> 初始化。
- 双亲委派模型:优先委托父类加载器加载,确保核心类库安全,避免重复加载。若父类无法加载,子类才尝试加载。
- GC (垃圾回收)
- 判断对象存活:可达性分析算法(GC Roots)。
- 收集算法:标记清除、复制、标记整理、分代收集。
- LeakCanary
- 内存泄漏检测工具,基于 WeakReference 和 ReferenceQueue 实现,自动监控 Activity/Fragment 生命周期结束后的对象残留。
- HashMap & ConcurrentHashMap
- HashMap:数组 + 链表 + 红黑树(JDK 1.8+),线程不安全。
- ConcurrentHashMap:JDK 1.7 分段锁,JDK 1.8 CAS + synchronized,保证高并发下的线程安全。
- 事件分发
- 流程:Activity -> Window -> DecorView -> ViewGroup -> View。
- 关键方法:
dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。
- Handler 机制
- 消息循环:Looper 从 MessageQueue 取消息,Handler 处理。
- 内存泄漏风险:静态 Handler 持有 Activity 引用,导致 Activity 无法回收。
2. 算法题
- 旋转链表 (LeetCode 61)
- 思路:计算链表长度,找到新尾部和头部,断开连接并拼接。
- 合并两个有序链表
- 思路:双指针遍历,比较节点值,依次链接较小节点。
二面:深入原理与系统设计
1. Java 进阶
- final 修饰 int 变量
- 常规方式不可变。通过反射可修改,利用 Field 的
setAccessible(true)绕过 final 检查,修改底层存储值。
- 常规方式不可变。通过反射可修改,利用 Field 的
- try-catch-finally
- finally 块无论是否抛出异常或 return 都会执行(除 System.exit())。JVM 在字节码层面将 finally 逻辑插入到异常处理和返回路径中。
- 接口 vs 抽象类
- 接口侧重行为契约,支持多实现;抽象类侧重代码复用,有状态属性。
- sleep vs wait

