android.util中提供的一些容器们

本文介绍了Android.util包下两种高效的容器——SparseArrays和ArrayMap。SparseArrays是针对int key的轻量级Key-Value存储,内存占用小,适用于数据量不大且key为int类型的情况。ArrayMap则支持任意类型的key,内存效率高,但查找和操作速度相对较慢,适合数据量较小的场景。此外,文章还提及了Android.util中其他替代Java容器的选项,如ArraySet、LongSparseArray等。
摘要由CSDN通过智能技术生成

参考资料:https://blog.csdn.net/u010687392/article/details/47809295

SparseArrays

特点:

  • 占用内存小
  • Key-Value存储
  • 内部通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间

应用场景:

  • 数据量不大,最好在千级以内
  • key必须为int类型

官网介绍:https://developer.android.google.cn/reference/android/util/SparseArray

  •   SparseArrays将整数映射到对象。与普通的对象数组不同,索引中可能存在空白。它的目的是比使用HashMap将整数映射到对象更高的内存效率,因为它避免了自动装箱键,并且其数据结构不依赖每个映射的额外入口对象。

  •   请注意,此容器将其映射保存在数组数据结构中,并使用二进制搜索来查找键。该实现不适用于数据量大的数据结构。它通常比传统的HashMap慢,因为查找需要二分搜索并添加和删除需要插入和删除数组中的条目。对于存放上百个条目的容器,与HashMap相比性能差异小于50%

  •   为了提高性能,容器在删除键时包含一个优化:不是立即压缩其数组,而是将删除的条目标记为已删除。然后可以将该条目重新用于相同的密钥,或稍后在所有移除的条目的单个垃圾收集步骤中进行压缩。这个垃圾收集需要随时生成数组或者检索Map大小或条目数量。

  •   可以使用keyAt(int)和valueAt(int)遍历此容器中的项目。使用keyAt(int)通过索引的递增值对键进行迭代将按照升序顺序返回键,或者在valueAt(int)的情况下按照升序顺序返回键的值

ArrayMap

特点:

  • 应用场景与SparseArray类似
  • 不同点在于key可以存储任意类型

官网介绍:https://developer.android.google.cn/reference/android/util/ArrayMap

  •   ArrayMap是一种通用的key->value映射数据结构,它被设计为比传统的HashMap更具有内存效率。它将映射保存在数组数据结构中每个项目的哈希代码的整数数组,以及键/值对的Object数组。这使得它可以避免为放入地图的每个条目创建额外的对象,并且还试图更积极地控制这些数组大小的增长(因为增长它们只需要复制数组中的条目,而不是重建哈希映射)。

  •   请注意,此实现不适用于可能包含大量项目的数据结构。它通常比传统的HashMap慢,因为查找需要二分搜索并添加和删除需要插入和删除数组中的条目。对于容纳数百种物品的容器,性能差异不显着,小于50%。

  •   由于此容器旨在更好地平衡内存使用,与大多数其他标准Java容器不同,它会在从其中删除项目时收缩其阵列。如果您设置容量然后移除项目,则可能会降低容量以更好地匹配当前大小。未来,设置容量的明确要求应该关闭这种积极的收缩行为。(意思大概是不提倡自行设置容量)


其实Android.Util还提供了其他一些容器替换Java容器,比如ArraySet,LongSparseArray,SparseBooleanArray,SparseIntArray,SparseLongArray。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值