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;
}
}

用SparseArray代替HashMap的更多相关文章

  1. 关于Android中ArrayMap/SparseArray比HashMap性能好的深入研究

    由于网上有朋友对于这个问题已经有了很详细的研究,所以我就不班门弄斧了: 转载于:http://android-performance.com/android/2014/02/10/android-sp ...

  2. SparseArray代替HashMap

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

  3. SparseArray替代HashMap来提高性能

    SparseArray是 Android框架独有的类,在标准的JDK中不存在这个类.它要比 HashMap 节省内存,某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为SparseAr ...

  4. Android开发 使用SparseArray代替HashMap[转载]

    源作者:Android小Y链接:https://www.jianshu.com/p/1828f14d7955来源:简书 前言 Android开发中,一个好的应用,除了要有吸引人的功能和交互之外,在性能 ...

  5. 73.Android之SparseArray替代HashMap

    转载:https://liuzhichao.com/p/832.html HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定 ...

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

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

  7. 使用SparseArray代替HashMap

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

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

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

  9. 性能优化:使用SparseArray代替HashMap<Integer,Object>(转)

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

随机推荐

  1. 第二届CCF软件能力认证

    1. 相邻数对 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 输出一个 ...

  2. 德卡Z90读卡器读取社保卡,德卡Z90读卡器CSharp示例程序源码

    前言,最近学习调用 医保卡业务,使用德卡读卡器,主要就是调用一个DLL,动态库文件. 借着自学的机会把心得体会都记录下来,方便感兴趣的小伙伴学习与讨论. 内容均系原创,欢迎大家转载分享,但转载的同时别 ...

  3. 002.WordPress常见插件

    Akismet Akismet 是 WordPress 官方推荐的一款 WordPress 防垃圾评论插件,也是默认已安装的插件. WP-Postviews 最好的最流行的WordPress浏览次数统 ...

  4. [代码审计]云ec电商系统代码审计

    0x00 前言 看了一下博客内最新的文章,竟然是3月28号的,一个多月没写文章了,博客都长草了. 主要是临近毕业,事情繁多,也没有啥时间和心情静下来写.. 不过现在的话,毕业的东西告一段落了,几乎没啥 ...

  5. Android-认识Service

    Android-认识Service 学习自 郭霖的博客 https://developer.android.google.cn/reference/android/app/Service#WhatIs ...

  6. HTML5开启浏览器桌面通知 Web Notification

    说明: 1.Chrome要求必须https才可以开启浏览器通知 2.显示图片在本服务器,不支持跨越 3.自定义声音Chrome不播放,Firefox正常播放 代码如下: <!-- /** * @ ...

  7. 洛谷P1220关路灯[区间DP 提前计算代价]

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  8. node-webkit开发桌面应用

    Node-Webkit能够做什么呢?(打开链接看discuss) github 项目源:https://github.com/rogerwang 导言 node-webkit 是一个很神奇的桌面客户端 ...

  9. 两个或多个线程执行完成之后继续执行之后的步骤,CountDownLatch与CyclicBarrier

    开发过程中或多或少会遇到一个方法需要等待两个及以上线程执行结果,如此我们如何处理,这里java提供两个方法CountDownLatch 和CyclicBarrier 方法,以下依次举例说明: Coun ...

  10. 0xWS2812 STM32 driver for WS2812(B) RGB LEDs

    0xWS2812 STM32 driver for WS2812(B) RGB LEDs 0xWS2812 pronounced "hex-WS2812" This code ai ...