【Android那些高逼格的写法】LinkedList和SparseArray

开始嘚啵

今天要来说说的是ArrayList和LinkedList,还有HashMap和SparseArray,ArrayList和HashMap确实不是什么高逼格的写法。但是LinkedList和SparseArray用的还是少数吧。

ArrayList和LinkedList

ArrayList是一个我们常用的动态数组,用起来也是非常的方便,但是他的性能到底如何呢?

我们来做个实验:

【Android那些高逼格的写法】LinkedList和SparseArray_第1张图片
image

我们利用这段代码计算一下ArrayList的remove耗时,和访问耗时(为了效果明显,我使用1000次的叠加)

image

从这个结果中我们可以发现,对于ArrayList来说访问耗时较小,也很简单,但是对于删除来说,耗时还是非常大的,这是因为数组中处于被删除元素之后的所有元素都要向数组的前端移动。但是使用LinkedList就不会出现该问题,因为LinkedList采用的是链表的形式,链表的概念这里就不做过多解释了,不明白的朋友可以查一下链表的结构,很容易理解。

再来试一下:

【Android那些高逼格的写法】LinkedList和SparseArray_第2张图片
image

结果如下:

image

很明显删除的时间减少了很多,但是由于链表的形式在访问上面性能差一些,所以在使用的时候需要根据场景进行选择。

HashMap和SparseArray

HashMap与LinkedList相似,也是链表形式,但是HashMap需要存储的内容有:key、value、hash值、和next(下一个Item),所以从内存上并不是很占优势,还是来看一下效果:

【Android那些高逼格的写法】LinkedList和SparseArray_第3张图片
image

内存占用效果很明显:

【Android那些高逼格的写法】LinkedList和SparseArray_第4张图片
image

如果使用SparseArray呢,效果如下:

【Android那些高逼格的写法】LinkedList和SparseArray_第5张图片
image

内存占用:

【Android那些高逼格的写法】LinkedList和SparseArray_第6张图片
image

这是由于SparseArray中其实只有两个数组,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间。但是SparseArray是Android特有的类型,JDK中并不包含,所以只能Android的开发者使用,官方也是推荐使用SparseArray代替HashMap。

但是在数据量较大的情况下,SparseArray性能表现并不出色,这是由于它是对key利用二分法进行从小到大排序,在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index。

所以朋友们可以根据场景进行选择使用。

精彩推荐

【Android那些高逼格的写法】Callable与 Future

【Android那些高逼格的写法】泛型的应用

6000套android源码直接放送

更新说明

本文是来自我公号的文章,欢迎大家关注我的公众号,更快的更新更友爱的微信群更全的源码示例

【Android那些高逼格的写法】LinkedList和SparseArray_第7张图片
image

你可能感兴趣的:(【Android那些高逼格的写法】LinkedList和SparseArray)