Android SparseArray与ArrayMap

简介: 公共类数据Constant.java/** * 常量类 * @author mazaiting * @date 2018/2/7 */public class Constant { public static final int ...

公共类数据Constant.java

/**
 * 常量类
 * @author mazaiting
 * @date 2018/2/7
 */

public class Constant {
    public static final int MAX = 1000000;
    public static final String TAG = "tag";
}

1. SparseArray与HashMap正序插入测试

HashMapTest.java

/**
 * HashMap测试类
 * @author mazaiting
 * @date 2018/2/7
 */

public class HashMapTest {
    /**
     * 正序插入
     */
    public void insertAdesc() {
        // 创建HashMap
        HashMap<Integer, String> hashMap = new HashMap<>();
        // 获取当前时间
        long start = System.currentTimeMillis();
        // 获取当前内存
        long startTotalMemory = Runtime.getRuntime().totalMemory();
        // 插入数据
        for (int i = 0; i < Constant.MAX; i++) {
            // 插入单条数据
            hashMap.put(i, String.valueOf(i));
        }
        // 获取结束时间
        long end = System.currentTimeMillis();
        // 获取结束时的内存
        long endTotalMemory = Runtime.getRuntime().totalMemory();
        // 获取插入所用时间
        long time = end - start;
        // 获取插入所用内存
        long memory = endTotalMemory - startTotalMemory;
        // 打印信息
        Log.e(Constant.TAG,"<---HashMap的插入时间--->" + time +"<---HashMap占用的内存--->" + memory);
    }
}

程序执行结果:

<---HashMap的插入时间--->6623<---HashMap占用的内存--->136007680

SparseArrayTest.java

/**
 * SparseArray测试类
 * @author mazaiting
 * @date 2018/2/7
 */

public class SparseArrayTest {
    /**
     * 正序插入
     */
    public void insertAdesc() {
        // 创建SparseArray
        SparseArray<String> sparseArray = new SparseArray<>();
        // 获取当前时间
        long start = System.currentTimeMillis();
        // 获取当前内存
        long startTotalMemory = Runtime.getRuntime().totalMemory();
        // 插入数据
        for (int i = 0; i < Constant.MAX; i++) {
            // 插入单条数据
            sparseArray.put(i, String.valueOf(i));
        }
        // 获取结束时间
        long end = System.currentTimeMillis();
        // 获取结束时的内存
        long endTotalMemory = Runtime.getRuntime().totalMemory();
        // 获取插入所用时间
        long time = end - start;
        // 获取插入所用内存
        long memory = endTotalMemory - startTotalMemory;
        // 打印信息
        Log.e(Constant.TAG,"<---SparseArray的插入时间--->" + time +"<---SparseArray占用的内存--->" + memory);
    }

程序执行结果:

<---SparseArray的插入时间--->2806<---SparseArray占用的内存--->23846912

2. SparseArray与HashMap倒序插入测试

HashMapTest.java

/**
 * HashMap测试类
 * @author mazaiting
 * @date 2018/2/7
 */

public class HashMapTest {
    /**
     * 倒序插入
     */
    public void insertDesc() {
        // 创建HashMap
        HashMap<Integer, String> hashMap = new HashMap<>();
        // 获取当前时间
        long start = System.currentTimeMillis();
        // 获取当前内存
        long startTotalMemory = Runtime.getRuntime().totalMemory();
        // 插入数据
        for (int i = Constant.MAX; i > 0; i--) {
            // 插入单条数据
            hashMap.put(i, String.valueOf(i));
        }
        // 获取结束时间
        long end = System.currentTimeMillis();
        // 获取结束时的内存
        long endTotalMemory = Runtime.getRuntime().totalMemory();
        // 获取插入所用时间
        long time = end - start;
        // 获取插入所用内存
        long memory = endTotalMemory - startTotalMemory;
        // 打印信息
        Log.e(Constant.TAG,"<---HashMap的插入时间--->" + time +"<---HashMap占用的内存--->" + memory);
    }
}

程序执行结果:

<---HashMap的插入时间--->5942<---HashMap占用的内存--->-20185088

SparseArrayTest.java

/**
 * SparseArray测试类
 * @author mazaiting
 * @date 2018/2/7
 */

public class SparseArrayTest {
    /**
     * 倒序插入
     */
    public void insertDesc() {
        // 创建SparseArray
        SparseArray<String> sparseArray = new SparseArray<>();
        // 获取当前时间
        long start = System.currentTimeMillis();
        // 获取当前内存
        long startTotalMemory = Runtime.getRuntime().totalMemory();
        // 插入数据
        for (int i = Constant.MAX; i > 0; i++) {
            // 插入单条数据
            sparseArray.put(i, String.valueOf(i));
        }
        // 获取结束时间
        long end = System.currentTimeMillis();
        // 获取结束时的内存
        long endTotalMemory = Runtime.getRuntime().totalMemory();
        // 获取插入所用时间
        long time = end - start;
        // 获取插入所用内存
        long memory = endTotalMemory - startTotalMemory;
        // 打印信息
        Log.e(Constant.TAG,"<---SparseArray的插入时间--->" + time +"<---SparseArray占用的内存--->" + memory);
    }
}

程序执行结果:

java.lang.OutOfMemoryError--内存溢出

3. SparseArray与HashMap倒序插入测试

HashMapTest.java

/**
 * HashMap测试类
 * @author mazaiting
 * @date 2018/2/7
 */

public class HashMapTest {
    /**
     * 读取数据
     */
    public void get() {
        // 创建HashMap
        HashMap<Integer, String> hashMap = new HashMap<>();
        // 插入数据
        for (int i = 0; i < Constant.MAX; i++) {
            // 插入单条数据
            hashMap.put(i, String.valueOf(i));
        }
        // 获取当前时间
        long start = System.currentTimeMillis();
        // 获取当前内存
        long startTotalMemory = Runtime.getRuntime().totalMemory();
        // 循环获取数据
        for (int i = 0; i < Constant.MAX; i++) {
            // 获取数据
            hashMap.get(i);
        }
        // 获取结束时间
        long end = System.currentTimeMillis();
        // 获取结束时的内存
        long endTotalMemory = Runtime.getRuntime().totalMemory();
        // 获取插入所用时间
        long time = end - start;
        // 获取插入所用内存
        long memory = endTotalMemory - startTotalMemory;
        // 打印信息
        Log.e(Constant.TAG,"<---HashMap的读取时间--->" + time +"<---HashMap占用的内存--->" + memory);
    }

}

** 程序执行结果:**

<---HashMap的读取时间--->817<---HashMap占用的内存--->0

SparseArrayTest.java

/**
 * SparseArray测试类
 * @author mazaiting
 * @date 2018/2/7
 */

public class SparseArrayTest {
    /**
     * 读取数据
     */
    public void get() {
        // 创建SparseArray
        SparseArray<String> sparseArray = new SparseArray<>();
        // 插入数据
        for (int i = 0; i < Constant.MAX; i++) {
            // 插入单条数据
            sparseArray.put(i, String.valueOf(i));
        }
        // 获取当前时间
        long start = System.currentTimeMillis();
        // 获取当前内存
        long startTotalMemory = Runtime.getRuntime().totalMemory();
        // 循环获取数据
        for (int i = 0; i < Constant.MAX; i++) {
            // 获取数据
            sparseArray.get(i);
        }
        // 获取结束时间
        long end = System.currentTimeMillis();
        // 获取结束时的内存
        long endTotalMemory = Runtime.getRuntime().totalMemory();
        // 获取插入所用时间
        long time = end - start;
        // 获取插入所用内存
        long memory = endTotalMemory - startTotalMemory;
        // 打印信息
        Log.e(Constant.TAG,"<---SparseArray的读取时间--->" + time +"<---SparseArray占用的内存--->" + memory);
    }
}

** 程序执行结果:**

<---SparseArray的读取时间--->412<---SparseArray占用的内存--->0

SparseArray、ArrayMap与HashMap结论

假设数据量都在千级以内的情况下:

  • 如果key的类型已经确定为int类型,那么使用SparseArray,因为它避免了自动装箱的过程,如果key为long类型,它还提供了一个LongSparseArray来确保key为long类型时的使用
  • 如果key类型为其它的类型,则使用ArrayMap
目录
相关文章
|
存储 Java Android开发
Android轻量级数据SparseArray详解
Android轻量级数据SparseArray详解
118 0
|
存储 Android开发 容器
Android之SparseArray<E>详解
Android之SparseArray<E>详解
201 0
Android之SparseArray<E>详解
|
Android开发
Android利用SparseArray替换使用HashMap&lt;Integer,E&gt;
MainActivity如下: package cc.testsparsearray; import java.util.HashMap; import java.
1071 0
|
2月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
145 11
|
6月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1208 77
|
3月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
170 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
7月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
417 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
7月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
209 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
7月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
166 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
8月前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
362 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程