我想知道SparseArray
和HashMap
之间的性能和效率,并且哪一个更好使用。我无法理解何时使用SparseArray
以及何时使用Hashmap
。
我想知道SparseArray
和HashMap
之间的性能和效率,并且哪一个更好使用。我无法理解何时使用SparseArray
以及何时使用Hashmap
。
SparseArray
是你应该选择的。现在,假设一下你的键是整数,但也是连续的(0、1、2、3、4……n),在这种情况下,最好的集合选择是什么呢?好吧,假设你的值是Strings
,在这种情况下,你在这里的最佳选择将是一个String
数组(String[]
)。之所以这样说,是因为String
数组以最小的性能影响回答了你的所有需求。myStringArray[0]
将返回键'0'的String
值,依此类推。SparseArray
的工作原理与此完全相同,只是我们允许数组中的某些值为空(因此,“稀疏”)。SparseArray
将在幕后创建一个大数组,并使用整数键作为放置值的数组索引。本质上,HashMaps
也是这样工作的——在幕后有一个大的整数数组,用于放置值。唯一的区别是,在HashMaps
中,键不是整数,它们可以是任何东西。为了我们的例子,假设键是Strings
。HashMap
将使用哈希函数将这个String
键转换为整数,然后将其用于定位数组中的值。这可能导致两个不同的Strings
产生相同的整数。在这些情况下,HashMap
将执行另一个操作,如在数组中排队值,或生成一个新键等等。这和通过哈希函数生成一个整数键有时可能涉及到相当多的性能。SparseArray
允许你完全跳过这一点,因为对于整数键,这些都是不必要的,因此更有效率。Android关于SparseArray的文档说:
相较于传统HashMap,它通常更为缓慢,因为查找需要进行二分搜索,添加和删除需要在数组中插入和
删除条目。
它旨在比使用HashMap将整数映射到对象更加内存
效率高,因为它避免了自动装箱键,并且其数据结构不需要
对每个映射都依赖于额外的条目对象。
因此,简而言之,当键是原始类型时,可以使用Sparse数组来替换哈希映射。