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 {@Overrideprotected 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;}
}

用SparseArray代替HashMap相关推荐

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

    Android开发中高效的数据结构用SparseArray代替HashMap 转载于:https://www.cnblogs.com/zhujiabin/p/5775435.html

  2. SparseArray代替HashMap

    相信大家都明白,手机软件的开发不同于PC软件的开发,因为手机性能相对有限,内存也有限,所谓"寸土寸金",可能稍有不慎,就会导致性能的明显降低.Android为了方便开发者,特意在a ...

  3. Android应用性能优化之使用SparseArray替代HashMap(转)

    HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performanc ...

  4. HashMap can be replaced with SparseArray--Android应用性能优化之使用SparseArray替代HashMap

    HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performanc ...

  5. 【移动开发】SparseArray替代HashMap

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

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

    HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performanc ...

  7. 【转】HashMap,ArrayMap,SparseArray源码分析及性能对比

    HashMap,ArrayMap,SparseArray源码分析及性能对比 jjlanbupt 关注 2016.06.03 20:19* 字数 2165 阅读 7967评论 13喜欢 43 Array ...

  8. 数据结构HashMap(Android SparseArray 和ArrayMap) 1

    HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...

  9. Android中HashMap内存优化之ArrayMap和SparseArray

    ArrayMap及SparseArray是android的系统API,是专门为移动设备而定制的.用于在一定情况下取代HashMap而达到节省内存的目的. 在Android开发中HashMap使用频率相 ...

最新文章

  1. 距离产生美?k近邻算法python实现
  2. vs调试显示16进制如何调节为10进制
  3. DRF (Django REST framework) 框架介绍
  4. 干货 | 深度学习名词表:57个专业术语加相关资料解析(附论文)
  5. js读取外部json指定字段值完整代码_前端工程化 剖析npm的包管理机制(完整版)...
  6. 实战干货!Spring Cloud Gateway 整合 OAuth2.0 实现分布式统一认证授权!
  7. php 压缩动态gif,php 压缩图片处理png、gif背景变黑问题
  8. opencv 图像属性
  9. matlab日期textscan,求助:在MATLAB里如何输入时间序列中的时间
  10. vsftpd pam_mysql_vsftpd+mysql+pam虚拟用户无法登录ftp服务器,请给位大侠帮忙!
  11. java 降低jdk版本_jdk1.7降级到1.6 | 学步园
  12. make_heap(), pop_heap(), push_heap()用法
  13. SAP UI5 初学 ( 一 )、简介
  14. 浏览器插件镜像下载地址
  15. LA 4487 Exclusive-OR
  16. 计算机主机号截图,电脑如何截图?截图三种方法推荐
  17. Android源代码中引用@hide类出现引用异常的问题error: cannot find symbol
  18. 介绍中国传统节日的网页html,关于中国传统节日介绍的作文
  19. php储存网页内容的简单示范
  20. 2058:简单计算器

热门文章

  1. 堡垒机的使用-及功能
  2. 如果常数项没有经过显著性检验_Cg,Cgk 能代替偏倚显著性检验?
  3. Axure中推动拉动元件不生效_单线图标元件库SVG矢量图标 纯净无干扰的Axure元件库...
  4. mysql 存储过程月单拆天单_为部门整理的mysql_db使用军规
  5. as安装过程中gradle_重新认识AndroidStudio和Gradle,这些都是我们应该知道的
  6. windows服务器指定IP地址才能进行远程访问桌面设置方法
  7. arcgis api for javascript 距离与面积量算
  8. openssh相关文件传输功能
  9. 修改adb shell在pc端显示的名称
  10. Android调试之tombstone信息的分析