美文网首页
SparseArray分析

SparseArray分析

作者: 锐心凌志 | 来源:发表于2019-06-27 16:38 被阅读0次

在写SparseArray某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为SparseArray不需要对key和value进行auto-boxing(将原始类型封装为对象类型,比如把int类型封装成Integer类型),结构比HashMap简单(SparseArray内部主要使用两个一维数组来保存数据,一个用来存key,一个用来存value)不需要额外的额外的数据结构

key为int的时候才能使用,注意是int而不是Integer,这也是sparseArray效率提升的一个点,去掉了装箱的操作

插入

100000条数据的存储使用DDMS查看,hashMap的存储空间14M左右,而SparseArray自由8M多几乎是少了40%接近
插入时候,SparseArray 正序插入效率比起倒序插入快了几乎是10倍, hashMap差不多。
我们是按照1,3,2的顺序排列的,但是在SparseArray内部还是按照正序排列的,这时因为SparseArray在检索数据的时候使用的是二分查找,所以每次插入新数据的时候SparseArray都需要重新排序,所以代码4中,逆序是最差情况。

SparseArray原理

单纯从字面上来理解,SparseArray指的是稀疏数组(Sparse array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。
假设有一个97的数组,其内容如下

image

*在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用

image

其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间

继续阅读SparseArray的源码,从构造方法我们可以看出,它和一般的List一样,可以预先设置容器大小,默认的大小是10:

 public SparseArray() {
        this(10);
    }

注意事项

SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的类,目的是提高内存效率,其核心是折半查找函数(binarySearch)。注意内存二字很重要,因为它仅仅提高内存效率,而不是提高执行效率,
它只适用于android系统(内存对android项目有多重要,地球人都知道)。SparseArray有两个优点:1.避免了自动装箱(auto-boxing),2.数据结构不会依赖于外部对象映射。我们知道HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置,存放的都是数组元素的引用,通过每个对象的hash值来映射对象。而SparseArray则是用数组数据结构来保存映射,然后通过折半查找来找到对象。但其实一般来说,SparseArray执行效率比HashMap要慢一点,因为查找需要折半查找,而添加删除则需要在数组中执行,而HashMap都是通过外部映射。但相对来说影响不大,最主要是SparseArray不需要开辟内存空间来额外存储外部映射,从而节省内存

相关文章

  • SparseArray源码分析

    SparseArray源码分析 SparseArray(稀疏数组)是什么?类似于map,可以储存key-value...

  • SparseArray分析

    在写SparseArray某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为SparseArray...

  • SparseArray分析

    1、首先要关注两个数组 mKeys :int[] 按从小到大排序 mValues:存储数据,index与mKeys...

  • SparseArray分析

    在写SparseArray某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为SparseArray...

  • SparseArray分析

    SparseArray分析 SparseArray是一个稀疏数组,所谓稀疏数组就是指数组中的大部分内容值未被使用(...

  • HashMap,SparseArray比较

    数据基于JDK1.8主要分析分析SparseArray,HashMap 查找效率,内存空间占用 原理分析 Hash...

  • SparseArray原理分析

    系列文章地址:Android容器类-ArraySet原理解析(一)Android容器类-ArrayMap原理解析(...

  • SparseArray源码分析

    SparseArray是Android官方推荐的一种高效率的Map类工具,如果key值是int值,最好使用Spar...

  • SparseArray 原理分析

    本文发表于KuTear's Blog,转载请注明 Put Delete & Remove Append

  • SparseArray源码分析

    SparseArray是android.util包中提供的类,用于建立整数对对象的映射,比HashMap性能更佳,...

网友评论

      本文标题:SparseArray分析

      本文链接:https://www.haomeiwen.com/subject/ykircctx.html