参考资料:https://blog.csdn.net/u010687392/article/details/47809295
SparseArrays
特点:
- 占用内存小
- Key-Value存储
- 内部通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间
应用场景:
- 数据量不大,最好在千级以内
- key必须为int类型
官网介绍:https://developer.android.google.cn/reference/android/util/SparseArray
- SparseArrays将整数映射到对象。与普通的对象数组不同,索引中可能存在空白。它的目的是比使用HashMap将整数映射到对象更高的内存效率,因为它避免了自动装箱键,并且其数据结构不依赖每个映射的额外入口对象。
- 请注意,此容器将其映射保存在数组数据结构中,并使用二进制搜索来查找键。该实现不适用于数据量大的数据结构。它通常比传统的HashMap慢,因为查找需要二分搜索并添加和删除需要插入和删除数组中的条目。对于存放上百个条目的容器,与HashMap相比性能差异小于50%。
- 为了提高性能,容器在删除键时包含一个优化:不是立即压缩其数组,而是将删除的条目标记为已删除。然后可以将该条目重新用于相同的密钥,或稍后在所有移除的条目的单个垃圾收集步骤中进行压缩。这个垃圾收集需要随时生成数组或者检索Map大小或条目数量。
- 可以使用keyAt(int)和valueAt(int)遍历此容器中的项目。使用keyAt(int)通过索引的递增值对键进行迭代将按照升序顺序返回键,或者在valueAt(int)的情况下按照升序顺序返回键的值
ArrayMap
特点:
- 应用场景与SparseArray类似
- 不同点在于key可以存储任意类型
官网介绍:https://developer.android.google.cn/reference/android/util/ArrayMap
- ArrayMap是一种通用的key->value映射数据结构,它被设计为比传统的HashMap更具有内存效率。它将映射保存在数组数据结构中每个项目的哈希代码的整数数组,以及键/值对的Object数组。这使得它可以避免为放入地图的每个条目创建额外的对象,并且还试图更积极地控制这些数组大小的增长(因为增长它们只需要复制数组中的条目,而不是重建哈希映射)。
- 请注意,此实现不适用于可能包含大量项目的数据结构。它通常比传统的HashMap慢,因为查找需要二分搜索并添加和删除需要插入和删除数组中的条目。对于容纳数百种物品的容器,性能差异不显着,小于50%。
- 由于此容器旨在更好地平衡内存使用,与大多数其他标准Java容器不同,它会在从其中删除项目时收缩其阵列。如果您设置容量然后移除项目,则可能会降低容量以更好地匹配当前大小。未来,设置容量的明确要求应该关闭这种积极的收缩行为。(意思大概是不提倡自行设置容量)