17

我提到了“SparseBooleanArray”类的 android 文档站点,但仍然不知道该类的目的是什么?出于什么目的我们需要使用该类?

这是文档链接 http://developer.android.com/reference/android/util/SparseBooleanArray.html

4

4 回答 4

31

根据我从文档中得到的信息,它用于将整数值映射到布尔值。

也就是说,如果您想要映射,如果应该为某个用户 ID 显示一个小部件并且一些用户 ID 已被删除,那么您的映射中就会出现空白。

这意味着,对于普通数组,您将创建一个 size=maxID 的数组,并向 index=userID 处的元素添加一个布尔值。然后在遍历数组时,您将不得不在最坏的​​情况下遍历 maxID 元素,并且必须检查null该索引是否没有布尔值(例如,ID 不存在)。那真是低效。

当使用 hashmap 来执行此操作时,您可以将 ID 映射到布尔值,但是会增加为 key 生成 hashvalue 的开销(这就是它被称为 * hash *map 的原因),这最终会首先在 CPU 周期中损害性能以及 RAM 使用情况。

所以 SparseBooleanArray 似乎是处理这种情况的一个很好的中间体。

注意:尽管我的示例确实是人为的,但我希望它能够说明这种情况。

于 2013-09-16T07:53:40.637 回答
6

就像javadoc说的那样,SparseBooleanArrays map integers to booleans这基本上意味着它就像一个以整数作为键,以布尔值作为值(Map)的映射。

但是,在这种特殊情况下使用会更有效It is intended to be more efficient than using a HashMap to map Integers to Booleans

希望这可以消除您对描述的任何问题。

于 2013-09-16T07:49:06.233 回答
3

我发现稀疏布尔数组有一个非常具体和美妙的用途。

您可以将真值或假值与列表中的位置相关联。

例如:List item #7被点击,所以把7作为key,true作为value。

于 2016-02-03T01:32:12.187 回答
0

可以通过三种方式来存储资源 ID

1 个数组

包含 id 作为索引的布尔数组。如果我们使用了该 id,则将其设置为 true,否则为 false

虽然所有的操作都很快,但是这个实现需要大量的空间。所以它不能被使用

空间复杂度高

2哈希图

密钥 ID

值布尔 True/False

使用这个我们需要使用哈希函数来处理每个id,这会消耗内存。而且可能会有一些空的位置没有存储id,我们还需要处理崩溃。所以由于使用复杂度和中等空间复杂度,它未使用。

中等空间复杂度

3稀疏布尔数组

它是中间方式。它使用映射数组实现

密钥 - ID

值 - 布尔值 True/False

它是一个 ArrayList,它以递增的顺序存储 id。因此使用最小空间,因为它只包含正在使用的 id。对于搜索,使用 id 二进制搜索。虽然二分查找 O(logn) 比散列 O(1) 或数组 O(1) 慢,即所有操作插入、删除、搜索将花费更多时间,但内存浪费最少。所以为了节省内存,我们更喜欢 SparseBoolean Array

最小空间复杂度

于 2018-06-08T10:35:53.843 回答