Android性能优化之SparseArray

原创 2016年07月09日 21:21:29

SparseArray是什么

官网
简单来说,SparseArray是一个从Interger到Object的映射Map,是Android里专门为 < Integer,Object >这样的hashmap而写的用于提高效率的类。正如其中文翻译稀疏矩阵,简单粗暴保存有效的数据信息,提高内存使用率。

特点:
1. 比hashmap有更高的内存效率
2. 使用折半查找,寻找key
3. 不是很适合大数据项
4. 比传统hashmap慢,但是对于几百项的数据而言,性能差距不到很大,小于50%

SparseArray优化方式

那么SparseArray是如何实现优化的呢?
1. 避免自动装箱
2. 每个映射不依赖多余的入口对象
3. 每次删除数据时不立刻压缩数组,而是先标记为已删除,等下次相同的key重复使用或者等待垃圾回收时对所有移除的key一起处理。

SparseArray实现方式

SparseArray中成员定义

    private int[] mKeys;//key按照大小排序
    private Object[] mValues;//数值
    private int mSize;//大小

下面的话说明了一个问题:对SparseArray的增删查改等操作。都是在mKeys,mValues,mSize操作。
是的!SparseArray的数据结构就是两个数组,这就是它内存优化的奥秘!

    /**
     * 添加键值对到数组中,如果key已经存在就代替
     */
    public void put(int key, E value) {
        int i = ContainerHelpers.binarySearch(mKeys, mSize, key);//二叉查找对应key是否存在

        if (i >= 0) {
            mValues[i] = value;//key已经存在直接赋值
        } else {
            i = ~i;

            if (i < mSize && mValues[i] == DELETED) {//查看是否在标记删除的键中,在则重用被标记删除的空间

                mKeys[i] = key;
                mValues[i] = value;
                return;
            }

            if (mGarbage && mSize >= mKeys.length) {//执行垃圾回收
                gc();

                // Search again because indices may have changed.
                i = ~ContainerHelpers.binarySearch(mKeys, mSize, key);
            }

            mKeys = GrowingArrayUtils.insert(mKeys, mSize, i, key);//插入key
            mValues = GrowingArrayUtils.insert(mValues, mSize, i, value);//插入value
            mSize++;//size+1
        }
    }

而hashmap则由于节点指针,Table可能没有使用完全等问题对内存使用非常低!
参考:Java HashMap工作原理

SparseArray如何使用

SparseArray sparseArray = new SparseArray<String>();//此处String可用你自己的类型替换
spareArray.append(0,"hello");或者 spareArray.put(0,"hell0");//添加
int key =sparseArray.keyAt(1);  //查找键
String value=(String) sparseArray.valueAt(1);  //查找值
sparseArray.put(0, "jack"); 或者 sparseArray.setValueAt(0, "jack");  //修改
sparseArray.delete(0);  //删除

参考:Android利用SparseArray替换使用HashMap

版权声明:本文为博主原创文章,未经博主允许不得转载。

android性能优化之SparseArray

java层优化: 采用android特有的数据结构: 用 android.util.SparseArray android.util.Sparse...
  • JACKLIAO1
  • JACKLIAO1
  • 2015年09月03日 14:57
  • 287

Android应用性能优化之使用SparseArray

最近在看一些Android应用性能优化的文章时,发现提到了SparseArray替代HashMap可以优化app性能,就对SparseArray做了一番了解,并记录使用心得。一,我们来看看Sparse...
  • qq_16131393
  • qq_16131393
  • 2016年07月04日 15:27
  • 726

Android性能优化之SparseArray与ArrayMap

如果您是一个Android开发工程师,且你想成为一个更优秀的Android开发工程师,那么你来看看在Android上面是如和替代HashMap的把~...
  • walid1992
  • walid1992
  • 2016年04月01日 12:39
  • 4473

Android SparseArray源码详解

尊重原创,转载请标明出处    http://blog.csdn.net/abcdef314159 在Android开发中如果使用key为Integer的HashMap,就会出现黄色警告,提示使用Sp...
  • abcdef314159
  • abcdef314159
  • 2016年06月15日 14:31
  • 1148

Android Sparse*Array容器解析

我们知道android为了减小空间的占用,在系统中提供了特有的容器,这里主要是替换了键值对的存取容器,如果能明确知道在使用的过程中键是整型,则替代该类型的Map容器的就是sparse家族了,这里主要有...
  • xueshanhaizi
  • xueshanhaizi
  • 2016年04月02日 22:08
  • 1473

Android编程之SparseArray<E>详解

Android编程之SparseArray详解 分类: Android2012-09-01 13:13 4652人阅读 评论(3) 收藏 举报 android编程delete存储l...
  • pi9nc
  • pi9nc
  • 2013年09月07日 19:23
  • 9542

Android为什么要设计出Bundle而不是直接使用HashMap来进行数据传递 Android内存优化(使用SparseArray和ArrayMap代替HashMap)

1.Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key进行排序,所以在添...
  • wlimin0523
  • wlimin0523
  • 2016年04月28日 15:02
  • 709

Android内存优化(使用SparseArray和ArrayMap代替HashMap)

在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不能达到...
  • u010687392
  • u010687392
  • 2015年08月20日 16:06
  • 58017

android:应用性能优化SparseArray

(转载)http://www.cnblogs.com/zgqys1980/p/5109828.html HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果。最...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2016年02月23日 11:56
  • 417

sparseArray 遍历

1. 看来我找到了解决办法。我还没有正确的人注意keyAt(index)功能。 所以我会用这样下去 int key = 0; for(int i = 0; i 2. 如果你不关心键,然后val...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2016年02月23日 11:51
  • 6383
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android性能优化之SparseArray
举报原因:
原因补充:

(最多只允许输入30个字)