公共类数据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