SparseArray 是 Android 平台特有的数据结构,谷歌引入 SparseArray 的目的是替代 HashMap 从而节省内存空间,其用法与 HashMap 很类似。由 SparseArray 又可以派生出 SparseLongArray 和 LongSparesArray。要明白 SparseLongArray 和 LongSparesArray 这两个名字很有迷惑性的数据结构的区别,我们先来说一下 SparseArray:
从 SparseArray 源码的定义可以看到,SparseArray 的内部是通过两个数组对数据进行存储的, key 为 int 类型数组, 而 value 为 Object 类型数组。SparseArray 比 HashMap 更省内存、在某些条件下性能更好的主要原因,是它避免了对 key 的自动装箱(int 转为 Integer 类型)。关于 SparseArray 的更多细节(如添加删除使用二分查找)就不展开了,感兴趣的可以查阅相关资料。
因此**,SparseArray 的 key 必须为 int 类型**。
SparseArray 默认的 value 类型为 Object ,即任意类型。因此根据 value 类型的不同,它又可以细分派生出 SparseIntArray(key 为 int, value 为int)、SparseBooleanArray(key 为 int, value 为 boolean)、SparseLongArray(key 为 int, value 为 long) 等,使用方法与 SparseArray 大同小异。其中,SparseLongArray 如下:
前面说了, SparseArray 的 key 必须为 int 类型,而对于“特殊的 int 类型” — long , 也有相应的数据结构,这就是LongSparesArray:
可以看到,LongSparesArray 的 key 为 long 类型。
总结:
SparseLongArray 和 LongSparesArray 从名字上看具有混淆性,但还是有差异。本文从SparseLongArray 和 LongSparesArray 的 key 和 value 的不同,简单说明两者的区别,以方便使用。现简单总结如下:
SparseArray : key为 int, value 任意;
SparseLongArray:key 为 int, value 为 long;
LongSparesArray: key 为 long , value 任意 。
(Long 在前,key 为 long;Long 在后,value 为 long)
因此,当 key 为 int 或者 long 的时候,可以根据情况使用这三种数据结构来替代 HashMap 。