SparseArray 和 Hashmap 的区别?

Difference between SparseArray and Hashmap?

我想知道 SparseArrayHashMap 之间的性能和效率,以及哪个更好用。我不明白何时使用 SparseArray 以及何时使用 Hashmap

Android SparseArray 的文档说

  1. 它通常比传统的 HashMap 慢,因为查找 需要二进制搜索,添加和删除需要插入和
    删除数组中的条目。

  2. 本意是要多一些内存 比使用 HashMap 将整数映射到对象更有效,两者都
    因为它避免了自动装箱键并且它的数据结构没有
    每个映射依赖一个额外的条目对象。

所以,简而言之;当键是原始类型时,可以使用稀疏数组代替哈希映射。

SparseArray 是当您的映射键是一个整数时您应该做出的选择,并且这些整数不是连续的,这意味着不是 0、1、2、3、4、... n - 但更多比如,43、2045、12、5。

现在,让我们暂时假设您的键是整数,但也是连续的(0、1、2、3、4、... n)。在这种情况下,collection 的最佳选择是什么?好吧,假设您的值为 Strings。在这种情况下,您最好的选择是 String 数组 (String[])。这样做的原因是 String 数组以对性能影响最小的方式满足您的所有需求。

myStringArray[0] 会 return 键 '0' 的 String 值,依此类推。

SparseArray 的工作原理与此完全相同,除了我们允许数组中的某些值为空(因此,'sparse')。 A SparseArray 会在后台创建一个大数组,并使用整数键作为放置值的数组的索引。

本质上,HashMaps 也是这样工作的——在幕后有一个用于放置值的大整数数组。唯一的区别是在 HashMaps 中,键不是整数,它们可以是任何东西。为了我们的示例,假设键是 StringsHashMap 将使用散列函数将此 String 键转换为整数,然后使用它来定位数组中的值。这可能会导致两个不同的 Strings 产生相同整数的情况。在这些情况下,HashMap 将执行其他操作,例如在数组中对值进行排队,或生成新键等。这以及通过哈希函数生成整数键有时会涉及相当多的性能。

SparseArray 允许您完全跳过这个,因为对于整数键,none 是必要的,因此效率更高。