2022 年大厂 Android 面试题汇总与解析
本文汇总了 2022 年大厂 Android 面试核心考点,涵盖 JVM 类加载机制、变量作用域、多线程锁机制、单例模式及死锁问题。详细解析了 Android 事件分发、布局测量、RecyclerView 缓存、内存优化、ANR 处理及 IPC 通信等关键技术点。同时补充了 HashMap 原理、GC 机制及常见算法题解,旨在帮助开发者系统梳理知识体系,提升面试通过率。

本文汇总了 2022 年大厂 Android 面试核心考点,涵盖 JVM 类加载机制、变量作用域、多线程锁机制、单例模式及死锁问题。详细解析了 Android 事件分发、布局测量、RecyclerView 缓存、内存优化、ANR 处理及 IPC 通信等关键技术点。同时补充了 HashMap 原理、GC 机制及常见算法题解,旨在帮助开发者系统梳理知识体系,提升面试通过率。

Android 开发岗位竞争激烈,想要在大厂面试中脱颖而出,必须全面梳理知识点,扩充题库,并针对关键知识进行深入分析。本文汇总了多年大厂面经总结及核心考点深度解析,涵盖 JVM、并发编程、设计模式及 Android 核心机制等内容。
Java 文件经过一次编译后,生成 Java 字节码(class 文件)。然后在不同平台上使用不同的虚拟机(JVM)解释执行成机器码。这体现了 Java'一次编译,到处运行'的特性。在 Mac 系统上运行只需安装对应的 JVM 即可。
类加载过程主要分为以下阶段:
1. 加载 分为三步:获取二进制字节流;将静态存储结构转换为方法区中的运行时数据结构;生成一个对象放入 Java 堆中,作为对方法区的引用。
2. 验证 确保 class 文件的表示(魔数)、版本号、字段表、方法表、常量池、元数据及字节码指令的正确性。若任何一项验证失败,则加载终止。
3. 准备 为类变量分配内存并设置默认初始化值。此阶段仅处理 static 类变量。如果是 final 类型且为常量,会直接赋值到常量池中。
4. 解析 将符号引用替换为直接引用(指针或偏移量),涉及类、接口、字段和方法的解析。
5. 初始化
执行 <clinit> 方法,对静态变量和静态代码块进行初始化。
6. 使用 正常使用该 Class 对象。
7. 卸载 当 Class 不再被使用时,由 GC 卸载。
类加载遵循双亲委派模型。自定义加载器的父类是 AppClassLoader,其父类是 ExtClassLoader,最顶层是 BootstrapClassLoader。
加载类时,从当前类加载器开始,逐级向上委托给父加载器查找。这种机制保证了类的安全性和唯一性,即一个类只会被加载一次。判断两个对象是否相同的重要条件之一是它们是否由同一个类加载器加载。
Tips:
static synchronized)全被 lock。synchronized)全被 lock。new A().x() 和 new A().x(),对象不同,锁不同。若 A 是单例,则能互斥。ThreadLocal 为每个使用该变量的线程提供独立的变量副本。每个线程可以独立改变自己的副本,而不会影响其他线程所对应的副本,从而实现线程隔离。
public class SingletonInstance {
private static SingletonInstance singletonInstance = new SingletonInstance();
private SingletonInstance() {}
public static SingletonInstance getSingletonInstance() {
return singletonInstance;
}
}
public class SingletonInstance {
private static SingletonInstance singletonInstance;
private SingletonInstance() {}
public static SingletonInstance getSingletonInstance() {
if (singletonInstance == null) {
singletonInstance = new SingletonInstance();
}
return singletonInstance;
}
}
public class SingletonInstance {
private volatile static SingletonInstance singletonInstance;
private SingletonInstance() {}
public static SingletonInstance getSingletonInstance() {
if (singletonInstance == null) {
synchronized (SingletonInstance.class) {
if (singletonInstance == null) {
singletonInstance = new SingletonInstance();
}
}
}
return singletonInstance;
}
}
public class SingletonInstance {
private SingletonInstance() {}
private static class Holder {
private static SingletonInstance instance = new SingletonInstance();
}
public static SingletonInstance getInstance() {
return Holder.instance;
}
}
死锁是指多个进程因争夺资源而造成的一种僵局。若无外力作用,进程将无法继续推进。
Activity -> Window -> DecorView -> ViewGroup -> View。
dispatchTouchEvent:负责分发事件。onInterceptTouchEvent:ViewGroup 决定是否拦截事件,默认为 false。onTouchEvent:处理点击事件。
事件从上到下传递,从下到上消费。若子 View 消耗了事件,父 View 不会收到后续事件。setVisibility(GONE) 代替 remove/add 来切换显示状态。View 经过 scale 属性缩放后,其物理尺寸(width/height)不变,但绘制区域发生变化。y 轴对应的点坐标在逻辑坐标系中不变,但在屏幕坐标系中会根据缩放中心和比例发生偏移。触摸事件坐标需要根据缩放矩阵进行转换才能正确匹配。
onDraw 用于绘制自身内容。onDraw,因为它是容器,主要负责管理子 View。若需绘制背景等,可重写 onDraw,但通常建议通过子 View 或背景图实现。RecyclerView 有四级缓存:mCachedViews、mRecyclerPool、mAttachedScrap、mChangedScrap。
inSampleSize 降低分辨率。常见模式包括:单例模式(全局配置)、观察者模式(LiveData/RxBus)、工厂模式(Fragment 创建)、适配器模式(RecyclerView.Adapter)、策略模式(网络请求封装)。
常用方式:Binder、AIDL、Messenger、ContentProvider、Socket、File。
DCL 需要配合 volatile 关键字防止指令重排序,确保对象初始化完成后再赋值给引用。
Application Not Responding。主线程耗时超过 5 秒(对话框 10 秒)。
基于哈希表,数组 + 链表 + 红黑树(JDK 1.8+)。扩容机制为 2 倍,负载因子 0.75。Hash 冲突通过链表或树解决。
SSL/TLS 协议,通过握手建立加密通道。包含证书验证、密钥交换、对称加密传输。需确保证书链完整,防止中间人攻击。
IPC 方式如上。Binder 基于驱动层,通过 ServiceManager 管理服务,Client 端通过 Proxy 调用 Server 端 Stub 方法,涉及 Binder 驱动、Transaction 包。
输入两个升序链表,输出一个合并后的升序链表。
Android 开发的知识点体系庞大,面试考察重点在于基础扎实程度和实际解决问题的能力。高级工程师不仅要求掌握 API,还需深入理解底层原理和优化方案。持续学习与实践是提升竞争力的关键。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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