SparseArray 和 HashMap区别
Posted HelloWorld搬运工
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SparseArray 和 HashMap区别相关的知识,希望对你有一定的参考价值。
相同点:
HashMap和SparseArray,都是用来存储Key-value类型的数据。
于是同样的需要面对几个问题,hash值的计算、扩容、hash冲突、装载率过低
不同点:
数据结构方面:hashmap用的是链表。sparsearray用的是双数组。
性能方面:hashmap是默认16个长度,会自动装箱。如果key是int 的话,hashmap要先封装成Interger。sparseArray的话就就会直接转成int。所以spaseArray用的限制是key是int。数据量小于1k。如果key不是int小于1000的话。可以用Arraymap。
SparseArray三大特点:
双数组、删除O(1)、二分查找
为什么省内存?
HashMap
为了避免过多的哈希冲突,引入了负载因子,打个比方,负载因子使用默认值 0.75,这意味着容量达到了 75%,就会开始扩容,也就是必然有 25% 的空间是不存储数据而被浪费的。而 SparseArray
可以把数组利用到最后一个空间。
复杂度为什么这么低?
SparseArray
做了两个优化:
-
引入
DELETE
标记
既然底层使用了数组,数组的缺点是什么?—— 删除数据时需要搬移元素。SparseArray
对数组的删除不做数据搬移,引入 DELETE 标记,以此达到在删除时做到 O(1) 的时间复杂度。
在调用 size()
和put()
需要扩容时,才去清理 DELETE
标识。
-
优化追加元素
SparseArray
提供了一个append()
方法,来优化追加的情况。该方法会判断追加的key
值,是否大于数组中最大的值,如果是则直接追加在数组末尾,否则执行put()
方法插入mKey
数组。
以上是关于SparseArray 和 HashMap区别的主要内容,如果未能解决你的问题,请参考以下文章
Android应用性能优化之使用SparseArray替代HashMap
Android Gems — Java源码分析之HashMap和SparseArray