用SparseArray代替HashMap

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

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

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

一、和Hashmap的对比

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

替换原则:

1>

如果用到了: HashMap<Integer, E> hashMap = new HashMap<Integer, E>();

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

2>

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

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

3>

如果用到了:HashMap<Integer, Integer> 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;
    }
}
时间: 2024-08-05 16:03:05

用SparseArray代替HashMap的相关文章

关于Android中SparseArray比HashMap性能好的深入研究

由于网上有朋友对于这个问题已经有了很详细的研究,所以我就不班门弄斧了: 转载于:http://android-performance.com/android/2014/02/10/android-sparsearray-vs-hashmap.html http://liuzhichao.com/p/832.html SparseArray是Android框架独有的类,在标准的JDK中不存在这个类.它要比 HashMap 节省内存,某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为

Android应用性能优化之使用SparseArray替代HashMap

一.概述 最近在项目中看到了SparseArray,好奇研究了下. SparseArray是Android框架独有的类,在标准的JDK中不存在这个类.它要比 HashMap 节省内存,某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为SparseArray不需要对key和value进行auto-boxing(将原始类型封装为对象类型,比如把int类型封装成Integer类型),结构比HashMap简单(SparseArray内部主要使用两个一维数组来保存数据,一个用来存key,一

SparseArray替代hashmap

最近编程时,发现一个针对HashMap<Integer, E>的一个提示: 翻译过来就是:用SparseArray<E>来代替会有更好性能. 那我们就来看看源码中SparseArray到底做了哪些事情: 一.构造 从构造方法我们可以看出,它和一般的List一样,可以预先设置容器大小,默认的大小是10: [java] view plaincopy public SparseArray() { this(10); } public SparseArray(int initialCapa

android SparseArray替代HashMap的分析

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

关于SparseArray和HashMap的讨论笔记

SparseArray结构比HashMap简单(SparseArray内部主要使用两个一维数组来保存数据,一个用来存key,一个用来存value)不需要额外的额外的数据结构(主要是针对HashMap中的HashMapEntry而言的) 检索: SparseArray是使用折半查找(binarySearch)来进行检索的, 当SparseArray中存在需要检索的下标时,SparseArray的性能略胜一筹(表1). 但是当检索的下标比较离散时,SparseArray需要使用多次二分检索,性能显然

Android开发中高效的数据结构用SparseArray代替HashMap

Android开发中高效的数据结构 android开发中,在java2ee或者android中常用的数据结构有Map,List,Set,但android作为移动平台,有些api(很多都是效率问题)显然不够理想,本着造更好轮子的精神,android团队编写了自己的api用来代替java api 1.SimpleArrayMap<K,V>与ArrayMap<K,V> 实质上ArrayMap继承自SimpleArrayMap,主要是为了实现像HashMap一样的api方法,让习惯使用Ha

73.Android之SparseArray替代HashMap

转载:https://liuzhichao.com/p/832.html HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performance 警告. sparsearray 意思就是说用SparseArray <E> 来替代,以获取更好性能.老实说,对SparseArray并不熟悉,第一感觉应该是Android提供的一个类.按住Ctrl点击进入SparseAr

性能优化:使用SparseArray代替HashMap&lt;Integer,Object&gt;(转)

HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performance 警告. 意思就是说用SparseArray<E>来替代,以获取更好性能.老实说,对SparseArray并不熟悉,第一感觉应该是Android提供的一个类.按住Ctrl点击进入SparseArray的源码,果不其然,确定是Android提供的一个工具类. 单纯从字面上来理解,SparseArr

性能优化:使用SparseArray代替HashMap&lt;Integer,Object&gt;

HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performance 警告. 意思就是说用SparseArray<E>来替代,以获取更好性能.老实说,对SparseArray并不熟悉,第一感觉应该是Android提供的一个类.按住Ctrl点击进入SparseArray的源码,果不其然,确定是Android提供的一个工具类. 单纯从字面上来理解,SparseArr