安卓开发中,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 | 减少内存碎片和对象创建开销 |
SparseArray
而不是 HashMap
?解答:SparseArray
专为 Android 优化,键为 int
类型,避免了自动装箱(Integer
)带来的额外内存开销。
HashMap
存储键 int
时会转为 Integer
对象,增加内存消耗。 SparseArray
直接存储 int
键,内存占用更低,尤其适合存储 View ID 等场景。Parcelable
与 Serializable
的区别是什么?解答:
| 特性 | Parcelable
| Serializable
|
|———————|—————————————|————————————-|
| 性能 | 更高(无需反射,手动编码) | 较低(依赖反射机制) |
| 兼容性 | 仅支持 Android 平台 | 跨平台通用 |
| 实现复杂度 | 需手动实现 writeToParcel
和 CREATOR
| 自动生成(需实现 Serializable
接口)|
| 适用场景 | 高性能要求的场景(如 UI 组件传递) | 跨平台序列化需求 |
:在 Android 开发中,优先使用 Parcelable
以提高性能