转载请注明链接:https://blog.csdn.net/feather_wch/article/details/81538653
SparseArray
版本: 2018/8/9-1(13:19)
1、SparseArray是什么?
- Android因为手机性能和内存有限,提供了一套高效的工具。SparseArray就是其中之一。
- SparseArray是Android特有的稀疏数组的实现,用于替换HashMap中Key = Integer,Value=Object的情况。
- SparseArray的效率相比于HashMap并没有多少提升。数据量达到10万条时,正序插入方面SparseArray效率高,倒序插入HashMap比SparseArray快很多,查询方面HashMap却会更快一点。
- SparseArray在数据量达到10万条时,内存方面能比HashMap节约27%。
1.
2、SparseArray的特点
- 适合Key=Integer,Value=Object的情况
- 内存占用更小.(根据情况进行取舍)
- 线程不安全
- 少量数据时SpareArray比较适合,大量数据时HashMap的性能更高。
3、SparseArray家族的四种集合
//用于替换 HashMap<Integer,String>
SparseArray<String> SparseArray11=new SparseArray<String>();
SparseArray11.append(1,"dd");
//用于替换 HashMap<Integer,boolean>
SparseBooleanArray sparseBooleanArray=new SparseBooleanArray();
sparseBooleanArray.append(1,false);
//用于替换 HashMap<Integer,int>
SparseIntArray SparseIntArray=new SparseIntArray();
SparseIntArray.append(1,1);
//用于替换 HashMap<Integer,long>
SparseLongArray SparseLongArray=new SparseLongArray();
SparseLongArray.append(1,1111000L);
插入
4、SparseArray的插入效率
- 每次插入都选择二分查找,因此在倒序插入的时候情况汇恒糟糕。
- HashMap的插入,会进行冲突处理,而不需要遍历每个值。因此效率更高。
删除
设计模式
5、SparseArray采用的设计模式
原型模式
- 原型模式内存中复制数据,不会调用到类的构造的方法.
- 原型模式内访问权限对原型模式无效。
SparseArray和HashMap性能对比
6、SparseArray和HashMap的性能
数据量 | 插入速度 | 内存大小 | 查找速度 | |
---|---|---|---|---|
10,0000 | 正序 | SparseArray插入略快 | SparseArray内存占用小27% | HashMap胜出 |
倒序 | HashMap要快一个数量级 | SparseArray内存占用小27% | HashMap胜出 |
SparseArray、HashMap、ArrayMap性能对比
1、正序插入性能排名(最优情况)
- SparseArray NO1
- ArrayMap NO2
- HashMap NO3
2、倒序插入性能排名(最差情况)
- HashMap NO1:
30%的优化
- SparseArray NO2
- ArrayMap NO3
3、内存占用比
- SparseArray NO1
- HashMap、ArrayMap NO2
4、查询性能对比
直接对比图
是有一定问题的,在数据量达到10万
的时候HashMap性能也是最好的,因此会有一个反超过程。
5、总结
- 正序插入(最快):1-SparseArray 2-ArrayMap 3-HashMap
- 倒序插入(最快): 1-HashMap 2-SparseArray 3-ArrayMap
- 内存占用比(最少):1-SparseArray 2-ArrayMap/HashMap
- 查询速度: 1-HashMap 2-SparseArray 3-ArrayMap
因此数据量大时,HashMap最好。如果想解决空间或者数据较少时,SparseArray更好。