携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的30天,点击查看活动详情
在 Android 开发中可以使用的各种数据结构中,SparseArray有一个 . 人们HashMap在使用键值为整数的数据结构时经常会注意到这一点。这是因为,在 Android Studio 中,如果您使用具有Integer类型作为键值的 ,则会发出警告以使用 。如果 是这样,它有什么好处以至于它从Android层面推动它? HashMap``SparseArraySparseArray
SparseArray
首先,如果你看英文单词Sparse,它有以下含义。
稀有
如果你了解了SparseArray的本质,你就会明白它为什么叫Sparse。
首先,官方文档中介绍的概念SparseArray如下。
SparseArray将整数映射到对象,并且与普通的对象数组不同,它的索引可以包含间隙。SparseArray旨在比 a 更节省内存[HashMap](https://developer.android.com/reference/java/util/HashMap),因为它避免了自动装箱键,并且它的数据结构不依赖于每个映射的额外条目对象。
如上所述,SparseArray是将 Object 映射到 Integer key value的数据结构。即使它是一个数组,您也可以在每个索引之间创建一个空白空间。比如1包含一个对象,表示2可以跳过,3包含一个对象。换句话说,这是一个以稀疏(很少)方式对包含对象的数组进行刻痕的人。
在这种情况下,HashMap与 不同的是,内部没有创建任何对象,因此无需使用 Wrapper 类进行装箱,因此 空间 性能更好。(即,避免自动装箱)
官方文档SparseArray还添加了对应用于 .
为了提高性能,容器在删除键时包含了一项优化:它不会立即压缩其数组,而是将删除的条目标记为已删除。然后,该条目可以重新用于相同的密钥,或者稍后在所有已删除条目的单个垃圾收集中进行压缩。每当需要增长数组,或者检索映射大小或条目值时,都必须执行此垃圾收集。
根据上面的描述,为了SparseArray提高性能,在移除特定的键值映射数据时,实际上并没有移除并进行数组压缩,而是**Deleted显示为一个状态**。如果另一个数据被添加到指向相应Value的Key中, 则再次填充。由于这种优化,删除操作的效率提高了。
\
SparseArray可以用作 (我不会在这篇文章中详细介绍如何使用它)
private val DEFAULT_ORIENTATIONS = SparseIntArray().apply {
append(Surface.ROTATION_0, 90)
append(Surface.ROTATION_90, 0)
append(Surface.ROTATION_180, 270)
append(Surface.ROTATION_270, 180)
}
private val INVERSE_ORIENTATIONS = SparseIntArray().apply {
append(Surface.ROTATION_0, 270)
append(Surface.ROTATION_90, 180)
append(Surface.ROTATION_180, 90)
append(Surface.ROTATION_270, 0)
}
\
使用 SparseArray 时的注意事项
SparseArray将Key→Value 映射信息存储在数组结构中,并以二进制形式搜索数组以找到 key。由于这个特点,它不太适合存储大量物品的情况。这是由于执行二分查找,数据量大时数组数据结构的插入和删除操作很慢。也就是说,在时间复杂度方面的表现相对较差。
但是,只要不经过数百条数据,二分查找所需的时间就会收敛到一个常数时间,插入和删除等操作也很快,从而获得了HashMap更好的性能。因此 ,适当映射少量数据时最好使用它。