用SparseArray代替HashMap

来源:互联网 发布:淘宝客域名注册技巧 编辑:程序博客网 时间:2024/04/19 22:16

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

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

 

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

 

一、和Hashmap的对比

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

替换原则:

1>

如果用到了: HashMap<IntegerEhashMap new HashMap<IntegerE>();

可以替换为:SparseArray<EsparseArray new SparseArray<E>();

2>

如果用到了:HashMap<IntegerBoolean> hashMap = new HashMap<Integer, Boolean>

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

3>

如果用到了:HashMap<IntegerInteger> hashMap = new HashMap<Integer, Integer>

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


二、用法

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

复制代码
        Button btn = null; // 测试view,无意义        Button btn02 = null; // 测试view,表示新增的对象        final int KEY = 1;        /*         * SparseArray指的是稀疏数组(Sparse         * array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用         * 。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。         */        SparseArray<View> array = new SparseArray<View>();
复制代码

 

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);
复制代码

 

三、测试代码

复制代码
package com.kale.pictest;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.util.SparseArray;import android.util.SparseBooleanArray;import android.view.View;import android.widget.Button;/** * @author: * @description  : * @web : http://stormzhang.com/android/2013/08/01/android-use-sparsearray-for-performance-optimization/ * @date  :2015年1月19日 */public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);        Log.d("TAG", "Max memory is " + maxMemory + "KB");                        Button btn = null; // 测试view,无意义        Button btn02 = null; // 测试view,表示新增的对象        final int KEY = 1;        /*         * SparseArray指的是稀疏数组(Sparse         * array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用         * 。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。         */        SparseArray<View> array = new SparseArray<View>();                /* 增加数据 */        //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;    }}
复制代码

 

0 0
原创粉丝点击