SparseArray

SparseArray是android提供的一个工具类,它可以用来替代hashmap进行对象的存储,其内部实现了一个矩阵压缩算法,很适合存储稀疏矩阵的。

PS:support包中还提供了兼容的类SparseArrayCompat不知道是干什么的。

针对源码的详细分析:http://stormzhang.com/android/2013/08/01/android-use-sparsearray-for-performance-optimization/

一、和Hashmap的对比

既然android推荐用这个东西,自然有用它的道理。其内部实现了压缩算法,可以进行矩阵压缩,大大减少了存储空间,节约内存。此外它的查找算法是二分法,提高了查找的效率。

替换原则:

1>

如果用到了:HashMaphashMap=newHashMap();

可以替换为:SparseArraysparseArray=newSparseArray();

2>

如果用到了:HashMap hashMap = new HashMap

可以替换为:SparseBooleanArray array = new SparseBooleanArray();

3>

如果用到了:HashMap hashMap = new HashMap

可以替换为:SparseIntArray array = new SparseIntArray();

二、用法

既然是键值对那么就有增删改查,但要记得先初始化:

Button btn =null;//测试view,无意义Button btn02 =null;//测试view,表示新增的对象finalintKEY = 1;/** SparseArray指的是稀疏数组(Sparse

* array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用

* 。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。*/SparseArray array =newSparseArray();

2.1 增加数据

/*增加数据*///public void put(int key, E value) {}array.put(KEY, btn);//public void append(int key, E value){}array.append(KEY, btn);

2.2 修改数据

/*修改数据*///在put数据之前,会先查找要put的数据是否已经存在,如果存在就是修改,不存在就添加。//public void put(int key, E value)array.put(KEY, btn);//public void setValueAt(int index, E value)array.setValueAt(KEY, btn02);

2.3 查找数据

/*查找数据*///public E get(int key)array.get(KEY);//public E get(int key, E valueIfKeyNotFound)//其中get(int key)也只是调用了 get(int key,E valueIfKeyNotFound),最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值.get(int key)当找不到的时候,默认返回null。array.get(KEY, btn);//如果这个key找不到value,那么就返回第二个参数。和default value一样

2.4 通过位置,查找键的值

//查看第几个位置的键://public int keyAt(int index)array.keyAt(1);//如果找不到就返回-1

2.5 通过位置,查找值

//查看第几个位置的值://public E valueAt(int index)array.valueAt(1);//查看值所在位置,没有的话返回-1://public int indexOfValue(E value)array.indexOfValue(btn);

三、测试代码

packagecom.kale.pictest;importandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;importandroid.util.SparseArray;importandroid.util.SparseBooleanArray;importandroid.view.View;importandroid.widget.Button;/***@author:

* @description  :

* @web :http://stormzhang.com/android/2013/08/01/android-use-sparsearray-for-performance-optimization/* @date  :2015年1月19日*/publicclassMainActivityextendsActivity {

@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);intmaxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

Log.d("TAG", "Max memory is " + maxMemory + "KB");

Button btn=null;//测试view,无意义Button btn02 =null;//测试view,表示新增的对象finalintKEY = 1;/** SparseArray指的是稀疏数组(Sparse

* array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用

* 。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。*/SparseArray array =newSparseArray();/*增加数据*///public void put(int key, E value) {}array.put(KEY, btn);//public void append(int key, E value){}array.append(KEY, btn);/*修改数据*///在put数据之前,会先查找要put的数据是否已经存在,如果存在就是修改,不存在就添加。//public void put(int key, E value)array.put(KEY, btn);//public void setValueAt(int index, E value)array.setValueAt(KEY, btn02);/*查找数据*///public E get(int key)array.get(KEY);//public E get(int key, E valueIfKeyNotFound)//其中get(int key)也只是调用了 get(int key,E valueIfKeyNotFound),最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值.get(int key)当找不到的时候,默认返回null。array.get(KEY, btn);//如果这个key找不到value,那么就返回第二个参数。和default value一样//查看第几个位置的键://public int keyAt(int index)array.keyAt(1);//如果找不到就返回-1//查看第几个位置的值://public E valueAt(int index)array.valueAt(1);//查看值所在位置,没有的话返回-1://public int indexOfValue(E value)array.indexOfValue(btn);

SparseBooleanArray d;

}

}

你可能感兴趣的:(SparseArray)