Android中使用SparseArray替代HashMap提高性能

4、风险管理、信息安全与信息管理的核心原则 本文深入探讨了风险管理、信息安全与信息管理的核心原则,涵盖Risk IT框架、ISO 31000标准以及信息安全与信息管理的关键原则。通过案例分析与实际应用挑战的解析,帮助组织更好地应对数字化时代的风险与安全问题,实现可持续发展。 阅读详情

一、介绍

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

单纯从字面上来理解,SparseArray指的是稀疏数组(Sparse array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。

文中关于稀疏数组(Sparse array)的定义说明参照至:

http://hi.baidu.com/piaopiao_0423/item/d8cc2b99729f8380581461d1

二、使用

SparseArray<String> sparseArray=new SparseArray<String>();  
 
//增加  两种方式  
sparseArray.append(0, "This is 0");  
sparseArray.append(1, "This is 1");  
sparseArray.append(2, "This is 2");  

sparseArray.put(3, "This is 3");  
sparseArray.put(4, "This is 4");  

//修改  两种方式  
sparseArray.put(0, "This is new 0");//在put数据之前,会先查找要put的数据是否已经存在,如果存在就是修改,不存在就添加。
sparseArray.put(1, "This is new 1");  
sparseArray.setValueAt(2, "This is new 2");  
sparseArray.setValueAt(3, "This is new 3");  

//删除  四种方式
sparseArray.delete(0);  
sparseArray.remove(0); //直接调用的delete(int key)
sparseArray.removeAt(0); 
sparseArray.clear(); 

//查找数据
sparseArray.get(0);//当找不到的时候,默认返回null
sparseArray.get(0, "找不到的默认值");

//遍历, 注意:  
//在执行删除后sparseArray的size()是变化的,因此在遍历前,先求值。
for (int i = 0,j=sparseArray.size(); i < j; i++) {  
System.out.println("遍历得到位置"+i+"的值为:"+sparseArray.get(i));  
} 

//查找某个位置的键  ,注意:查看键所在位置,由于是采用二分法查找键的位置,所以找不到时返回小于0的数值,而不是返回-1。返回的负值是表示它在找不到时所在的位置。
int key =sparseArray.keyAt(1);  
System.out.println("查找位置1处的键 key="+key);  

//查找某个位置的值  
String value=(String) sparseArray.valueAt(1);  
System.out.println("查找位置1处的值 value="+value); 

//查看值所在位置,没有的话返回-1:
int index =sparseArray.indexOfValue("aa");

三. 其它

1.  在正序插入数据时候,SparseArray比HashMap要快一些;HashMap不管是倒序还是正序开销几乎是一样的;但是SparseArray的倒序插入要比正序插入要慢10倍以上。(因为SparseArray在检索数据的时候使用的是二分查找,所以每次插入新数据的时候SparseArray都需要重新排序,所以代码4中,逆序是最差情况。)

2. 相应的也有SparseBooleanArray,用来取代HashMap<Integer, Boolean>,SparseIntArray用来取代HashMap<Integer, Integer>,用法基本类似。

四、可序列化的扩展

地址:http://stackoverflow.com/questions/14899718/how-to-store-sparsearray-in-bundle

public class SerializableSparseArray<E> extends SparseArray<E> implements Serializable{

    private static final long serialVersionUID = 824056059663678000L;

    public SerializableSparseArray(int capacity){
        super(capacity);
    }

    public SerializableSparseArray(){
        super();
    }

    /**
     * This method is private but it is called using reflection by java
     * serialization mechanism. It overwrites the default object serialization.
     *
     * <br/><br/><b>IMPORTANT</b>
     * The access modifier for this method MUST be set to <b>private</b> otherwise {@link java.io.StreamCorruptedException}
     * will be thrown.
     *
     * @param oos
     *            the stream the data is stored into
     * @throws IOException
     *             an exception that might occur during data storing
     */
    private void writeObject(ObjectOutputStream oos) throws IOException {
        Object[] data = new  Object[size()];

        for (int i=data.length-1;i>=0;i--){
            Object[] pair = {keyAt(i),valueAt(i)}; 
            data[i] = pair;
        }
        oos.writeObject(data);
    }

    /**
     * This method is private but it is called using reflection by java
     * serialization mechanism. It overwrites the default object serialization.
     *
     * <br/><br/><b>IMPORTANT</b>
     * The access modifier for this method MUST be set to <b>private</b> otherwise {@link java.io.StreamCorruptedException}
     * will be thrown.
     *
     * @param oos
     *            the stream the data is read from
     * @throws IOException
     *             an exception that might occur during data reading
     * @throws ClassNotFoundException
     *             this exception will be raised when a class is read that is
     *             not known to the current ClassLoader
     */
    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        Object[] data = (Object[]) ois.readObject();
        for (int i=data.length-1;i>=0;i--){
            Object[] pair = (Object[]) data[i]; 
            this.append((Integer)pair[0],(E)pair[1]);
        }
        return;
    }


}


参考:

http://liuzhichao.com/p/832.html

http://www.open-open.com/lib/view/open1402906434918.html

jre9下载 jdk9 (Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】 立即下载

相关推荐

Verilog-asm小练习—PLL建模

Verilog- ams是Verilog标准的模拟混合信号语言,以下是对PLL建模的一种思路参考

weixin_44700185的博客 1016

android 替代map,Android 为什么推荐使用 SparseArray 来替代 HashMap?

Android 为什么推荐使用 SparseArray 来替代 HashMap?SparseArray 也许你没听过, 那正好今天就来学习一下咯, 这也是 Android 官方推荐使用的, 所以我们需要了解一下他的优势和劣势在哪些地方首先 SparseArray 用来和 HashMap 做比较, 在安卓项目中, 你新建一个 HashMap 对象, 注意下面会有下划线, 里面有提示翻译成白话文的意思...

weixin_35686326的博客 450

Revit模型转点云全流程:从OBJ导出到CloudCompare点云生成(2020版)

本文详细介绍了将Revit模型转换为点云数据的完整流程,特别针对Revit 2020用户。通过使用OBJ导出插件和开源软件CloudCompare,实现从模型导出、网格采样到生成结构化PCD点云的全过程,并提供了关键参数设置与常见问题解决方案,为BIM与三维数字孪生应用提供技术支持。

oo7890的博客 154

Android——HashMap的替代方案

1. Sparse数组 SparseBooleanArray : HashMap&lt;Integer,Boolean&gt; SparseLongArray : HashMap&lt;Integer, Long&gt; SparseIntArray : HashMap&lt;Integer,Integer&gt; SparseArray&lt;E&gt; : HashMap&lt;I...

GrassEva的博客 1489

泛微ecology9二次开发-附件上传接口实战:从表单创建到数据库存储解析

本文详细解析了泛微ecology9二次开发中的附件上传接口实战,从测试环境搭建、数据库表结构解析到接口代码实现,提供了全面的开发指南。重点介绍了文件上传的核心逻辑、常见问题排查及高级应用场景,帮助开发者高效实现附件上传功能并优化系统性能。

weixin_30836759的博客 477

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1111

Android为什么推荐使用SparseArray来替代HashMap?

SparseArray也许你没听过,那正好今天就来学习一下咯,这也是Android官方推荐使用的,所以我们需要了解一下他的优势和劣势在哪些地方。 首先SparseArray用来和HashMap做比较,在安卓项目中,你新建一个HashMap对象,注意下面会有下划线,里面有提示 翻译成白话文的意思就是建议使用SparseArray替代HashMap来获得更好的表现。我们都知道HashM...

我是紫色紫色的专栏 9883

8位可控加减法电路设计

一、设计要求   利用Logisim平台中现有运算部件构建一个8位可控加减法器,可支持八位加减法,利用已经封装全加器和逻辑门进行连接,要求实现相应的输出,判断是否溢出。 二、方案设计 实验原理: [A]补+[B]补 = [A+B]补(mod2^n+1)   公式1        [A-B]补 = [A]补+[-B]补(mod2^n+1)    公式2 FA为全加器,利用全加器实现加减法,难点在于实验减法,对输入的[Y]补各位取反加一即为[-Y]补,利用公式2,就可以将减法转化为加法再利用全加

qq_51700383的博客 1万+

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

Android开发中高效的数据结构 android开发中,在java2ee或者android中常用的数据结构有Map,List,Set,但android作为移动平台,有些api(很多都是效率问题)显然不够理想,本着造更好轮子的精神,android团队编写了自己的api用来代替java api 1、SimpleArrayMap与ArrayMap 实质上ArrayMap继承自SimpleArra

fancychendong的专栏 2万+

【GPIO模拟串口通信协议】

由于这段时间搞了个安卓相关的项目,需要和安卓进行Uart通信。但是选用的芯片并没有自带uart功能,所以在充分评估项目后,考虑波特率不高的情况下,决定使用GPIO去模拟串口通信协议了。

学海无涯苦作舟 2638

从零搭建私有AI工作站:Ollama+DeepSeek+Dify本地化部署全攻略

本文提供了一份详尽的本地化AI工作站搭建指南,核心在于实现数据安全与离线可用。通过整合Ollama、DeepSeek与Dify三大工具,手把手教你完成从环境配置、模型部署到可视化应用构建的全过程,重点解决了Dify连接Ollama等关键步骤,助你打造一个完全自主可控的私有AI开发环境。

weixin_28396629的博客 311

Android性能优化之HashMap的替代者

在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不能达到更好的性能,相反反而更消耗内存,所以针对Android这种移动平台,也推出了更符合自己的api,比如SparseArray、ArrayMap用来代替HashMap在有些情况下能带来更好的性能提升。 介

Small_Lee的博客 5070

OCR开发车架号识别vin码识别系统

一、vin码识别车架号识别系统简介   vin码识别车架号识别系统,结合VIN码主机厂数据库及自身多年文字识别经验,针对机动车配置参数等信息的查询及采集业务推出的一款VIN码自动识别产品。   车架号识别vin码识别,主要应用在智能手机IOS与Android两个平台中。前端扫描查询模式,无需联网,只需扫描汽车前挡风玻璃右下角的VIN玛(车架号),即可轻松识别出车辆产地、品牌、车

OCR13512721355的博客 1433

Android 基础 SparseArray 和 ArrayMap (HashMap替代)

在某些情况下他们比HashMap更加高效,对内存也进行了优化,所有可以用来代替HashMap使用 例子: SparseArray来替代HashMap<Integer, Object> SparseArray 类 针对HashMap【避免了自动装箱的过程】 针对HashMap【避免了额外的Entry对象】 (省略 android.util.) SparseArray key为int value为Object android.support.v4.util.SparseArrayC

louisgeek的专栏 310

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android map 改value,Android性能优化之使用SparseArray替代HashMap

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

weixin_39819661的博客 346

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

Android应用性能优化之使用SparseArray替代HashMap 发表于 2012-10-23   |   分类于 Android   |   暂无评论 HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果。最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performance 警告。

u012968084的博客 292

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android hashmap,Android中你还在用HashMap<Integer,Object>吗?

Android中你还在使用HashMap吗?众所周知,当我们要维护一个整型到对象的映射关系的时候,想定义一个Map会报错,我们必须使用Map。明明只需要使用一个整型数据,却要使用一个类。这并不是杀鸡用牛刀,而是一种浪费。是不是很押韵。SparseArray的简介SparseArray,是android.util包下的一个类,介绍是这样的:SparseArrays map integers to O...

weixin_42520573的博客 307

hashmap value占用空间大小_性能优化:为什么要使用SparseArray和ArrayMap替代HashMap?...

背景在Android开发中,性能优化是一个非常重要的模块,其中数据结构的性能优化是相当重要的,对于常用的HashMap来说,官方推荐我们使用SparseArray和ArrayMap替代它。Java为数据Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类的继承关系如...

weixin_39568083的博客 188

HashMap用SparseArray,SparseBooleanArray,SparseIntArray替换

一、和Hashmap的对比 既然android推荐用这个东西,自然有用它的道理。其内部实现了压缩算法,可以进行矩阵压缩,大大减少了存储空间,节约内存。此外它的查找算法是二分法,提高了查找的效率。 替换原则: 1&gt;如果用到了: HashMap&lt;Integer, E&gt; hashMap = new HashMap&lt;Integer, E&gt;(); 可以替换为:SparseArr...

bobby_fu的博客 357

SparseArray ArrayMap HashMap

在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不能达到更好的性能,相反反而更消耗内存,所以针对Android这种移动平台,也推出了更符合自己的api,比如SparseArray、ArrayMap用来代替HashMap在有些情况下能带来更好的性能提升。介绍它

博水之野,人杰地灵 351

Android优化adapter及SparseArray介绍

在鸿洋大神的博文里介绍了Android 快速开发系列 打造万能的ListView GridView 适配器在此,我直接把核心的部分截取出来详细记录一下: 这个是我在项目中使用的一个工具类:public class ViewHolderUtil { /** * 获取容器中指定的元素 * * @param view * @param id *

年少的风 1078

Android把数组从大到小排列,Android SparseArray 排序

场景:SparseArray 是android中用来取代HashMap的一种数据结构。既然android系统建议我们用SparseArray来代替HashMap,那我们还是按它说的做吧。但是在使用过程中,我们需要对他进行排序,比如按照数据的字母进行排序。解决方式:private SparseArray sortSparseArray(SparseArray arr){List keys = new...

weixin_39825941的博客 455

【Android】SparseArray和ArrayMap替换HashMap优化

在Android开发时,我们使用的大部分都是Java的api,比方HashMap这个api,使用率非常高,可是对于Android这样的对内存非常敏感的移动平台,非常多时候使用一些java的api并不能达到更好的性能,相反反而更消耗内存,所以针对Android这样的移动平台,也推出了更符合自己的api,比方SparseArray、ArrayMap用来取代HashMap在有些情况下能带来更好的性能提升。 介绍它们之前先来介绍一下HashMap的内部存储结构。就明确为什么推荐使用SparseArray和Array

sinat_36955332的博客 309

Android 日常使用学习笔记 ——SparseArray

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

北漂周的专栏(微信:stchou_zst) 1251

Android内存优化(使用SparseArray和ArrayMap代替HashMap)

本篇文章主要介绍了"Android内存优化(使用SparseArray和ArrayMap代替HashMap)",对于Android开发感兴趣的同学可以参考一下: 在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很...在Android开发时,我们使用的大部分都是Java的api,比如Has...

乡下的事业 721

android intnet传数组,Android SparseArray

Sparse array —稀疏数组原型解释:所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。SparseArray是android里为这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearc...

weixin_28873927的博客 181
上一篇: Android开发之onSaveInstanceState和onRestoreInstanceState
下一篇: Java中如何遍历Map对象的4种方法
我心V飞翔
博客等级 码龄16年 55粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值