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
目录
相关文章
|
API Android开发 Windows
Android P下WindowManager与LayoutParams的详解
WindowManager是什么?WindowManager与window的关系是什么?
594 0
|
Android开发
android PackageManager.setApplicationEnabledSetting()
android PackageManager.setApplicationEnabledSetting()
136 0
|
机器学习/深度学习 数据建模 vr&ar
为什么都是ViewGroup的LayoutParams,也会报cannot be cast to android.view.ViewGroup$MarginLayoutParams?
为什么都是ViewGroup的LayoutParams,也会报cannot be cast to android.view.ViewGroup$MarginLayoutParams?
335 0
|
存储 Android开发 容器
Android之SparseArray<E>详解
Android之SparseArray<E>详解
119 0
Android之SparseArray<E>详解
|
Android开发 Java 开发工具
Android Parcelable数据序列化详解
什么是什么是Parcelable Parcelable是Android sdk提供的用实现于数据序列化的一个接口,不同于Java中的基于磁盘或者网络的Serializable,Parcelable是基于内存的,由于内存的读写速度高于磁盘,因此在Android中跨进程对象传递一般使用Parcelable。
1304 0