从 SparseArray 到 ArrayMap:Android 中轻量级集合框架的演进
2023-12-18 01:19:26
前言
在 Android 开发中,集合框架是不可或缺的基础组件,用于存储和组织各种数据类型。对于小型数据集,使用传统集合框架(如 HashMap 或 ArrayList)可能会造成内存浪费。为了解决这一问题,Android 平台先后引入了 SparseArray(API level 1)和 ArrayMap(API level 19),专为小数据量场景优化。
SparseArray:先驱者的创新
SparseArray 是一种稀疏数组,特别适用于以 int 为 key 的映射场景。与传统的 HashMap 相比,SparseArray 采用更为紧凑的数据结构,仅在需要时才分配内存。这对于存储大量键值对且值不为 null 的情况非常有利,因为 SparseArray 可以通过仅存储非空值的索引来节省大量空间。
ArrayMap:优化后的继任者
ArrayMap 在 SparseArray 的基础上进行了改进,提供了更通用的映射实现,不仅支持 int key,还支持任意对象 key。ArrayMap 采用数组和散列表相结合的混合数据结构,在小数据量场景下,相对于 HashMap 具有明显的内存占用和性能优势。
源码分析:揭示设计原理
深入分析 SparseArray 和 ArrayMap 的源码,可以揭示其设计背后的原理和优势:
SparseArray:
- 采用 int[] 数组存储 key,Object[] 数组存储 value。
- 通过 key 的 hash 值快速定位索引,从而直接获取 value。
- 如果 key 不存在,则返回 null,避免了空值的开销。
ArrayMap:
- 采用 Object[] 数组存储 key 和 value,并使用散列表进行索引。
- 散列表将 key 哈希化后映射到数组索引,实现快速查找。
- 数组中相邻元素存储 key 和 value,提高空间利用率。
演进历程:满足不断变化的需求
SparseArray 和 ArrayMap 的演进历程反映了 Android 平台对小数据量集合框架不断变化的需求:
- SparseArray: 专为优化 int key 映射而设计,在 API level 1 引入,解决了早期 Android 版本中内存占用问题。
- ArrayMap: 在 API level 19 引入,提供更通用的映射实现,支持任意对象 key,进一步提升了小数据量场景下的效率。
优缺点对比:选择合适的数据结构
SparseArray 和 ArrayMap 各有优缺点,开发者应根据具体场景选择合适的数据结构:
特征 | SparseArray | ArrayMap |
---|---|---|
键类型 | int | 任意对象 |
内存占用 | 更小(仅存储非空值索引) | 略大(存储所有键值对) |
效率 | 较高(快速索引) | 较高(散列表查找) |
适用于 | int key 映射场景 | 任意对象 key 映射场景 |
结论
SparseArray 和 ArrayMap 是 Android 平台上小数据量场景下的轻量级集合框架,提供了高效的映射实现和优化内存占用。理解其设计原理和演进历程,可以帮助开发者根据具体需求选择合适的数据结构,提升 Android 应用程序的性能和稳定性。