SparseArray 和 Hashmap 的区别?
Difference between SparseArray and Hashmap?
我想知道 SparseArray
和 HashMap
之间的性能和效率,以及哪个更好用。我不明白何时使用 SparseArray
以及何时使用 Hashmap
Android SparseArray 的文档说
它通常比传统的 HashMap 慢,因为查找
需要二进制搜索,添加和删除需要插入和
删除数组中的条目。
本意是要多一些内存
比使用 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
中,键不是整数,它们可以是任何东西。为了我们的示例,假设键是 Strings
。 HashMap
将使用散列函数将此 String
键转换为整数,然后使用它来定位数组中的值。这可能会导致两个不同的 Strings
产生相同整数的情况。在这些情况下,HashMap
将执行其他操作,例如在数组中对值进行排队,或生成新键等。这以及通过哈希函数生成整数键有时会涉及相当多的性能。
SparseArray
允许您完全跳过这个,因为对于整数键,none 是必要的,因此效率更高。
我想知道 SparseArray
和 HashMap
之间的性能和效率,以及哪个更好用。我不明白何时使用 SparseArray
以及何时使用 Hashmap
Android SparseArray 的文档说
它通常比传统的 HashMap 慢,因为查找 需要二进制搜索,添加和删除需要插入和
删除数组中的条目。本意是要多一些内存 比使用 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
中,键不是整数,它们可以是任何东西。为了我们的示例,假设键是 Strings
。 HashMap
将使用散列函数将此 String
键转换为整数,然后使用它来定位数组中的值。这可能会导致两个不同的 Strings
产生相同整数的情况。在这些情况下,HashMap
将执行其他操作,例如在数组中对值进行排队,或生成新键等。这以及通过哈希函数生成整数键有时会涉及相当多的性能。
SparseArray
允许您完全跳过这个,因为对于整数键,none 是必要的,因此效率更高。