SparseArray和HashMap的区别是什么?

4

我想知道SparseArrayHashMap之间的性能和效率,并且哪一个更好使用。我无法理解何时使用SparseArray以及何时使用Hashmap

2个回答

8
当你的映射键是整数,而这些整数不是连续的,意思是不是0、1、2、3、4……n,而更像43、2045、12、5时,SparseArray是你应该选择的。现在,假设一下你的键是整数,但也是连续的(0、1、2、3、4……n),在这种情况下,最好的集合选择是什么呢?好吧,假设你的值是Strings,在这种情况下,你在这里的最佳选择将是一个String数组(String[])。之所以这样说,是因为String数组以最小的性能影响回答了你的所有需求。myStringArray[0]将返回键'0'的String值,依此类推。SparseArray的工作原理与此完全相同,只是我们允许数组中的某些值为空(因此,“稀疏”)。SparseArray将在幕后创建一个大数组,并使用整数键作为放置值的数组索引。本质上,HashMaps也是这样工作的——在幕后有一个大的整数数组,用于放置值。唯一的区别是,在HashMaps中,键不是整数,它们可以是任何东西。为了我们的例子,假设键是StringsHashMap将使用哈希函数将这个String键转换为整数,然后将其用于定位数组中的值。这可能导致两个不同的Strings产生相同的整数。在这些情况下,HashMap将执行另一个操作,如在数组中排队值,或生成一个新键等等。这和通过哈希函数生成一个整数键有时可能涉及到相当多的性能。SparseArray允许你完全跳过这一点,因为对于整数键,这些都是不必要的,因此更有效率。

非常好的解释。 - Mauker
如果 https://developer.android.com 没有说谎,那么如果你有可能包含大量项的“数据结构”,应该使用 HashMaps,因为 SparseArrays “不适合”这种情况。 - The incredible Jan

2

Android关于SparseArray的文档说:

  1. 相较于传统HashMap,它通常更为缓慢,因为查找需要进行二分搜索,添加和删除需要在数组中插入和
    删除条目。

  2. 它旨在比使用HashMap将整数映射到对象更加内存 效率高,因为它避免了自动装箱键,并且其数据结构不需要
    对每个映射都依赖于额外的条目对象。

因此,简而言之,当键是原始类型时,可以使用Sparse数组来替换哈希映射。


你的结论似乎是错误的。https://developer.android.com/reference/android/util/SparseArray.html:“该实现不适用于可能包含大量项目的数据结构。它通常比传统的HashMap慢,因为查找需要二进制搜索,添加和删除需要在数组中插入和删除条目。对于容纳数百个项目的容器,性能差异不显着,少于50%。” - The incredible Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接