上一篇
安卓开发数据结构详解
- 行业动态
- 2025-04-22
- 3
安卓开发中常用数据结构详解
基础集合类
安卓开发中,Java/Kotlin 的基础集合类是核心工具,需根据场景选择合适类型。
数据结构 | 特点 | 适用场景 |
---|---|---|
ArrayList |
动态数组,支持随机访问,内存连续 | 频繁读取、少量插入/删除 |
LinkedList |
链表结构,插入/删除高效,随机访问慢(O(n)) | 频繁插入/删除、少读取 |
HashMap |
键值对存储,基于哈希表,增删查改平均 O(1) | 快速查找、键值关联存储 |
HashSet |
基于 HashMap 实现,无重复元素 |
去重、元素存在性判断 |
安卓特有数据结构
Android 提供优化后的集合类,专为移动端内存和性能设计。
数据结构 | 特点 | 适用场景 |
---|---|---|
SparseArray |
键为 int 的优化版本,节省内存(无装箱开销) |
存储 int 键的键值对(如 View ID) |
SparseBooleanArray |
针对布尔值存储的优化版本 | 少量布尔值存储 |
LongSparseArray |
键为 long 的优化版本 |
长整型键值对存储 |
Bundle |
键值对容器,支持序列化,用于 Activity/Fragment 数据传递 | 组件间轻量级数据传递 |
Parcelable |
高效序列化接口,比 Serializable 性能更好 |
跨进程通信、保存实例状态 |
高级数据结构
部分复杂场景需借助高级数据结构或第三方库。
数据结构 | 特点 | 适用场景 |
---|---|---|
LiveData |
可观察的数据容器,生命周期感知 | MVVM 架构下的数据响应式更新 |
Flowable |
支持背压处理的响应式流(需 RxJava/Coroutines) | 异步数据处理、事件流管理 |
LruCache |
最近最少使用缓存,固定内存大小 | 内存缓存(如图片缓存) |
ArrayMap |
轻量级键值对存储,性能优于 HashMap (小规模数据) |
小规模键值对存储 |
性能优化建议
场景 | 优化方案 | 原因 |
---|---|---|
大量键值对存储 | 优先使用 SparseArray 代替 HashMap |
减少装箱开销,降低内存占用 |
频繁插入/删除 | 选择 LinkedList 而非 ArrayList |
链表插入/删除时间复杂度为 O(1) |
跨进程数据传递 | 实现 Parcelable 接口 |
比 Serializable 更高效 |
内存敏感场景 | 使用 ArrayMap 或 SparseArray |
减少内存碎片和对象创建开销 |
相关问题与解答
问题1:为什么 Android 推荐使用 SparseArray
而不是 HashMap
?
解答:SparseArray
专为 Android 优化,键为 int
类型,避免了自动装箱(Integer
)带来的额外内存开销。
HashMap
存储键int
时会转为Integer
对象,增加内存消耗。SparseArray
直接存储int
键,内存占用更低,尤其适合存储 View ID 等场景。
问题2:Parcelable
与 Serializable
的区别是什么?
解答:
| 特性 | Parcelable
| Serializable
|
|———————|—————————————|————————————-|
| 性能 | 更高(无需反射,手动编码) | 较低(依赖反射机制) |
| 兼容性 | 仅支持 Android 平台 | 跨平台通用 |
| 实现复杂度 | 需手动实现 writeToParcel
和 CREATOR
| 自动生成(需实现 Serializable
接口)|
| 适用场景 | 高性能要求的场景(如 UI 组件传递) | 跨平台序列化需求 |
:在 Android 开发中,优先使用 Parcelable
以提高性能