1、SharedPreferences 是什么
答案SP 是 Android 轻量级 XML 键值对本地存储,用来存少量配置、开关、登录状态、简单字符串、布尔、数字。底层在 /data/data/包名/shared_prefs 生成 xml 文件。
2、SP 底层原理
答案首次初始化把整个 XML 一次性全加载到内存;后续读取走内存很快;写入先改内存,再异步 / 同步落地到 XML。
3、SP apply () 和 commit () 区别
答案
- apply() :异步写入,不阻塞线程,无返回值,日常推荐用
- commit() :同步写入,阻塞当前线程,有布尔返回值,主线程慎用易卡顿 ANR
4、SP 有哪些缺点(必背)
答案
- 初始化全量加载,文件大就卡顿、占内存
- 不支持多进程,多进程读写会数据错乱、覆盖丢失
- 没有事务、不支持批量操作,频繁 IO 性能差
- 只能存基础类型,不能直接存对象、集合
- 每次编辑都会生成临时文件,频繁写入容易产生碎片、丢数据
5、MMKV 是什么
答案MMKV 是微信开源的 高性能本地键值存储框架,替代 SharedPreferences;基于 mmap 内存映射 实现,读写速度、性能、稳定性远优于 SP,支持多进程。
6、MMKV 底层原理(面试核心)
答案
- 采用 mmap 内存映射文件,把磁盘文件直接映射到内存;
- 读写直接操作内存地址,不用频繁 IO 读写磁盘;
- 数据采用 protobuf 紧凑二进制编码 存储,体积更小、解析更快;
- 增量写入,不用全量重写整个文件;
- 原生支持多进程并发读写,数据安全不丢失。
7、MMKV 为什么比 SP 快
答案
- 用 mmap 内存映射,减少系统调用和磁盘 IO
- 增量更新,只改变化部分,不用像 SP 全量重写 xml
- Protobuf 二进制编码,比 XML 文本解析更快、体积更小
- 没有 SP 一次性全量加载的开销,启动更快、内存占用更低
8、MMKV 支持什么特性
答案
- 支持 多进程安全读写
- 支持字符串、布尔、数字、ByteArray、直接存对象
- 支持加密存储
- 增量写入、性能高、不易丢数据
- 兼容 SP 迁移,一键迁移旧 SP 数据
9、MMKV 和 SP 核心对比
答案
表格
| 对比项 | SharedPreferences | MMKV |
|---|---|---|
| 底层实现 | XML 文件 | mmap + Protobuf 二进制 |
| 初始化 | 全量加载,大文件卡顿 | 按需映射,无全量加载 |
| 读写性能 | 一般,频繁写入慢 | 极高 |
| 多进程 | 不支持,数据错乱 | 原生支持、安全 |
| 存储格式 | 文本 XML,体积大 | 二进制,紧凑压缩 |
| 数据丢失 | 频繁编辑易丢数据 | 机制更稳,不易丢失 |
| 使用场景 | 少量简单配置 | 通用替代 SP、大量配置、多进程场景 |
10、多进程下 SP 有什么问题?怎么解决
答案原生 SP 多进程同时读写会覆盖、错乱、丢失数据;解决方案:放弃 SP,改用 MMKV 或 DataStore。
11、项目中为什么要用 MMKV 替代 SP
答案
- 解决 SP 卡顿、全量加载、性能差 问题
- 支持多进程场景,数据安全
- 二进制存储更省空间、读写更快
- 稳定性高,不易丢配置
- 接口和 SP 几乎一样,改造成本极低
12、MMKV 可以存对象吗
答案原生支持存字节数组,可配合 Gson/Protobuf 把对象转二进制存入;比 SP 手动拼接、解析更方便稳定。
13、面试一句话总结(必背)
SharedPreferences 是基于 XML 的轻量键值存储,适合少量配置,但存在全量加载卡顿、不支持多进程、频繁读写性能差易丢数据;MMKV 基于 mmap 内存映射 + Protobuf 二进制编码,增量写入、无需全量 IO,读写性能远超 SP,原生支持多进程安全读写,项目中全面替代 SP 做本地配置存储。
14、SharedPreferences 系统做的优化
-
内存缓存优化数据第一次读取后全量载入内存,后续读操作直接走内存,不用频繁读磁盘,读取很快。
-
**异步写入优化 apply ()**提供
apply()异步落盘,不阻塞主线程,避免 ANR;后台异步写入磁盘,不影响 UI。 -
线程安全优化底层加了同步锁,单进程下多线程读写安全。
-
文件读写合并多次 edit 提交会合并写入,减少磁盘 IO 次数。
-
版本兼容与缓存复用系统做了版本适配、文件校验,重启复用已有缓存文件,不用重复创建。
一句话面试标准答案
SharedPreferences 主要做了内存缓存、apply 异步写入、单进程线程安全、合并磁盘 IO、文件复用这几层优化,提升读取速度、避免主线程阻塞、减少频繁 IO 开销。