SparseArray的源码分析

                                                欢迎大家来到廖蜀黍的

今天给大家带来的是 SparseArray的源码分析:
通常的,我们在java中有了一个叫做hashmap的集合,那么为什么安卓还要来一个SparseArray呢?
那么今天,我们可以来看看这究竟怎么回事,
通过源码分析:

SparseArray的源码分析_第1张图片
image.png

我们可以看到,SparseArray定义了两个数组,分别是int类型和Obj类型,那么他们的作用是什么呢?
我们继续看:
SparseArray的源码分析_第2张图片
image.png

int类型的数组,存放了key ,Obj数组存放了value,那么他们的作用是神魔捏?
我们知道,hashmap的主要作用是存放数据,根据key去检索value,而SparseArray也具备这样的功能,那么SparseArray是怎么检索的呢?
我们接着往下看一个:
SparseArray的源码分析_第3张图片
image.png

嚯哦!!!我们竟然看到了这个,这个是什么呢?
我们继续看:
SparseArray的源码分析_第4张图片
image.png

这是什么鬼呢?熟悉java基础的都知道,这TM的是个典型的二分查找!!!
说道二分查找,我们就不得不说他的查找性能问题咯,
首先:
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x.
时间复杂度无非就是while循环的次数!
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O(h)=O(log2n);
也就是索:SparseArray在数据量大的情况下根本不适用!!!!性能最少降低50个percent!!!!!或者key不是有序的根本不可行!!
那么为什么还用这个SparseArray呢?
因为对比hashmap的数据结构,hashmap是有自增的机制的,hashmap中有一个Entry的东东,这个东东呢,是存储的内容有key、value、hash值、和next下一个Entry,那么,这些Entry数据是按什么规则进行存储的呢?就是通过计算元素key的hash值,然后对HashMap中数组长度取余得到该元素存储的位置,计算公式为hash(key)%len,比如:假设hash(14)=14,hash(30)=30,hash(46)=46,我们分别对len取余,得到
hash(14)%16=14,hash(30)%16=14,hash(46)%16=14,所以key为14、30、46的这三个元素存储在数组下标为14的位置,如果有多个元素key的hash值相同的话,后一个元素并不会覆盖上一个元素,而是采取链表的方式,把之后加进来的元素加入链表末尾,从而解决了hash冲突的问题,由此我们知道HashMap中处理hash冲突的方法是链地址法,然后捏:HashMap中默认的存储大小就是一个容量为16的数组,所以当我们创建出一个HashMap对象时,即使里面没有任何元素,也要分别一块内存空间给它,而且,我们再不断的向HashMap里put数据时,当达到一定的容量限制时(这个容量满足这样的一个关系时候将会扩容:HashMap中的数据量>容量*加载因子,而HashMap中默认的加载因子是0.75),HashMap的空间将会扩大,而且扩大后新的空间一定是原来的2倍,我们可以看put()方法中有这样的一行代码:
int newCapacity = oldCapacity * 2;
这也就是说ho,只要一满足扩容条件,HashMap的空间将会以2倍的规律进行增大。假如我们有几十万、几百万条数据,那么HashMap要存储完这些数据将要不断的扩容,而且在此过程中也需要不断的做hash运算,这将对我们的内存空间造成很大消耗和浪费,而且HashMap获取数据是通过遍历Entry[]数组来得到对应的元素,在数据量很大时候会比较慢,所以在Android中,HashMap是比较费内存的!!!!
反正巴拉巴拉一堆,有兴趣的可以看一哈hashmap的源码,这里就不做过多的分析啦!
而且SparseArray他的key是int的,而hashmap是Integer!也就是说SparseArray避免了自动装箱的操作.那这就很舒服了啊,
巴拉巴拉那么多其实无非就总结了两个点:
SparseArray只适合数据量小,key为int并且有序的,如果数据量很小,那就会体现出很大的内存优势!!!!
而且哦,SparseArray还提供了:
SparseArray的源码分析_第5张图片
image.png

这是什么呢?就是直接根据索引返回数组中的对象,也就是在你知道了索引的情况下可以直接跟操作数组一样,速度非常快的!

你可能感兴趣的:(SparseArray的源码分析)