当前位置:   article > 正文

每天记录学习的新知识 : SparseArray_longsparsearray

longsparsearray

一、什么是SparseArray??

代码中提示用SparseArray代替HashMap

在这里插入图片描述

  • 适用范围或者说作用是:

SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的类,目的是提高内存效率,其核心是折半查找函数(binarySearch)。

注意内存二字很重要,因为它仅仅提高内存效率,而不是提高执行效率,只适用于android系统。

SparseArray系列有如下这些:SparseArray,SparseBooleanArray,SparseIntArray,SparseLongArray,LongSparseArray

适用:

SparseArray          <int, Object>
LongSparseArray      <long, Object>
SparseBooleanArray   <int, boolean>
SparseIntArray       <int, int>
SparseLongArray      <int, long>
  • 1
  • 2
  • 3
  • 4
  • 5

二、对比HashMap?

HashMap是数组和链表的结合体,被称为链表散列.
SparseArray是单纯数组的结合.被称为稀疏数组,对数据保存的时候,不会有额外的开销

1、SparseArray 比之 HashMap 内存占用要小

稀疏数组的含义是:数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容

稀疏数组的结构:

在这里插入图片描述

SparseArray 的结构:

SparseArray 是对于稀疏数组的压缩表现。
在这里插入图片描述

从结构上可以看出,为什么SparseArray 占用内存更小。

2、效率:

HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置,存放的都是数组元素的引用,通过每个对象的hash值来映射对象。

SparseArray则是用数组数据结构来保存映射,然后通过折半查找来找到对象。

  • 正序:
    正序插入时SparseArray的效率要比HashMap的效率要高.并且占用的内存也比HashMap要小一些.

  • 倒序:
    SparseArray与HashMap无论是怎样进行插入,数据量相同时,前者都要比后者要省下一部分内存,但是效率在倒序插入的时候,SparseArray的插入时间和HashMap的插入时间远远不是一个数量级.由于SparseArray每次在插入的时候都要使用二分查找判断是否有相同的值被插入.因此这种倒序的情况是SparseArray效率最差的时候.

3、SparseArray 不需要对key和value进行auto-boxing

不需要将原始类型封装为对象类型,比如把int类型封装成Integer类型,结构比HashMap简单(SparseArray内部主要使用两个一维数组来保存数据,一个用来存key,一个用来存value)不需要额外的额外的数据结构

三、使用的栗子

        //声明
        SparseArray<String> sparseArray= new SparseArray<>();
        //增加元素,append方式
        sparseArray.append(0, "myValue");
        //增加元素,put方式
        sparseArray.put(1, "myValue");
        //删除元素,二者等同
        sparseArray.remove(1);
        sparseArray.delete(1);
        //修改元素,put或者append相同的key值即可
        sparseArray.put(1,"newValue");
        sparseArray.append(1,"newValue");
        //查找,遍历方式1
        for(int i=0;i<sparseArray.size();i++){
            Log.d(TAG,sparseArray.valueAt(i));
        }
        //查找,遍历方式2
        for(int i=0;i<sparseArray.size();i++){
            int key = sparseArray.keyAt(i);
            Log.d(TAG,sparseArray.get(key));
        }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

四、序列化

http://hk.voidcc.com/question/p-adrxtshq-kw.html

https://www.itdaan.com/blog/2013/06/21/a0fe4643ea3645ff4bb55c0a893511bb.html

直接序列化传输数据上面两种都不可用,借住Bundle实现了数据传输,记录于此~

参考地址

SparseArray浅析:https://blog.csdn.net/u013493809/article/details/21699121
SparseArray分析:https://blog.csdn.net/hq942845204/article/details/81293480

Android集合之SparseArray、ArrayMap详解:https://blog.csdn.net/hq942845204/article/details/81293480

Android学习笔记之性能优化SparseArray:https://www.cnblogs.com/RGogoing/p/5095168.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/666328
推荐阅读
相关标签
  

闽ICP备14008679号