SparseArray和ArrayMap的使用
SparseArray
优点
1、避免自动装箱和拆箱的效率损耗
2、定期通过gc函数来清理内存,内存利用率高
3、没有额外的结构体,存储元素成本更低
4、频繁的插入删除操作效率高(延迟删除机制保证了效率)
缺点:
1、增删改查基于二分查找,不适合大量数据的存储,数量越大,查询、增删效率明显降低,复制移动数组成本巨大,gc效率也降低
2、key值的类型被限制了
3、没有实现Serializable,不利于在Android中借助Bundle传输。
ArrayMap
ArrayMap是一个<key,value>映射的数据结构,它设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录key和Value值
优点
1、在数据量少时,内存利用率高,及时的空间压缩机制
2、迭代效率高,可以使用索引来迭代(keyAt(index)方法以及valueAt(index) 方法),相比于HashMap迭代使用迭代器模式,效率要高很多
缺点:
-
基于二分查找的存取复杂度高,空间压缩机制复杂,花费大
-
ArrayMap没有实现Serializable,不利于在Android中借助Bundle传输。
整体的取舍:
(1) 首先二者都是适用于数据量小的情况,但是SparseArray以及他的三兄弟们避免了自动装箱和拆箱问题,也就是说在特定场景下,比如你存储的value值全部是int类型,或者key是int/long类型,那么就采用SparseArray,其它情况就采用ArrayMap,还有如果是map中嵌套map的情况,就用ArrayMap.
(2) 数据量多的时候当然还是使用HashMap啦
其实我们对比一下它们二者,有很多共性,,也就是它们的出发点都是不变的就是以时间换空间,比如它们都有即时空间压缩机制,SparseArray 采用的延迟删除和gc机制来保证无用空间的及时压缩,ArrayMap 采用的删除时通过逻辑判断来处理空间的压缩,其实说白了,它们的设计者都是力求一种极致充分的内存利用率,这也必然导致了所带来的问题,例如插入删除逻辑复杂等,不过这和我们使用起来一点都不违背,我们只需要在合适的场景进行取舍即可。