【转载】Android应用性能优化之使…
来源:互联网 发布:cnc简单宏程式编程实例 编辑:程序博客网 时间:2024/06/03 18:09
原文链接:Android应用性能优化之使用SparseArray替代HashMap
HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果。最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个performance 警告。
sparsearray
意思就是说用SparseArray
android_util_sparsearray
单纯从字面上来理解,SparseArray指的是稀疏数组(Sparsearray)
假设有一个9*7的数组,其内容如下:
sparsearray_pic1
在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用稀疏数组重新来定义这个数组:
sparsearray_pic2.jpg
其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。
继续阅读SparseArray的源码,从构造方法我们可以看出,它和一般的List一样,可以预先设置容器大小,默认的大小是10:
publicSparseArray() {
this(10);
}
publicSparseArray(int initialCapacity) {
initialCapacity =ArrayUtils.idealIntArraySize(initialCapacity);
mKeys =newint[initialCapacity];
mValues =newObject[initialCapacity];
mSize =0;
}
再来看看它对数据的”增删改查”。
它有两个方法可以添加键值对:
publicvoidput(int key, Evalue) {}
publicvoidappend(int key, Evalue){}
有四个方法可以执行删除操作:
publicvoiddelete(int key) {}
publicvoidremove(int key) {} //直接调用的delete(intkey)
publicvoidremoveAt(int index){}
publicvoidclear(){}
修改数据起初以为只有setValueAt(int index, E value)可以修改数据,但后来发现put(int key, Evalue)也可以修改数据,我们查看put(int key, Evalue)的源码可知,在put数据之前,会先查找要put的数据是否已经存在,如果存在就是修改,不存在就添加。
publicvoidput(int key, Evalue) {
inti = binarySearch(mKeys, 0, mSize, key);
if(i > = 0) {
mValues[i]= value;
} else {
i = ~i;
if(i <</span> mSize && mValues[i]== DELETED) {
mKeys[i]= key;
mValues[i]= value;
return;
}
if(mGarbage&& mSize > = mKeys.length) {
gc();
// Searchagain because indices may have changed.
i = ~binarySearch(mKeys, 0,mSize,key);
}
…………
所以,修改数据实际也有两种方法:
publicvoidput(int key, Evalue)
publicvoidsetValueAt(int index, Evalue)
最后再来看看如何查找数据。有两个方法可以查询取值:
publicE get(int key)
publicE get(int key, EvalueIfKeyNotFound)
其中get(int key)也只是调用了 get(int key,EvalueIfKeyNotFound),最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值.get(intkey)当找不到的时候,默认返回null。
查看第几个位置的键:publicint keyAt(int index)
有一点需要注意的是,查看键所在位置,由于是采用二分法查找键的位置,所以找不到时返回小于0的数值,而不是返回-1。返回的负值是表示它在找不到时所在的位置。
查看第几个位置的值:public E valueAt(int index)
查看值所在位置,没有的话返回-1:public int indexOfValue(E value)
最后,发现其核心就是折半查找函数(binarySearch),算法设计的很不错。
privatestaticintbinarySearch(int[]a, int start, int len, int key) {
inthigh =start +len, low = start - 1, guess;
while(high- low> 1){
guess =(high+ low) / 2;
if(a[guess] <</span> key)
low =guess;
else
high =guess;
}
if(high== start+ len)
return~(start+ len);
elseif(a[high] == key)
returnhigh;
else
return~high;
}
相应的也有SparseBooleanArray,用来取代HashMap
HashMap
总结:
SparseArray是android里为 HashMap hashMap = new HashMap ();
时,我们可以使用如下的方式来取得更好的性能.SparseArray sparseArray = new SparseArray ();
注:
文中关于稀疏数组(Sparse array)的定义说明参照至:
http://hi.baidu.com/piaopiao_0423/item/d8cc2b99729f8380581461d1
- 【转载】Android应用性能优化之使…
- Android应用性能优化之绘图分析
- Android应用性能优化之绘图分析
- 《Android应用性能优化》之读书笔记
- Android应用性能优化之图形
- Android应用性能优化之使用SparseArray
- android应用性能优化之帧率
- Android应用性能优化之分析工具
- Android 性能优化之应用启动
- Android应用性能优化
- Android应用性能优化
- Android应用性能优化
- Android应用性能优化
- Android应用性能优化
- Android应用性能优化
- Android应用性能优化
- Android应用性能优化
- Android应用性能优化
- android 是值传递还是引用传递?
- 【转载】如何在canvas上绘制椭圆?
- 【转载】canvas 绘制正多边形
- canvas 上绘制正多边形 …
- Eclipse中的Libraries找不到Maven Dependencies
- 【转载】Android应用性能优化之使…
- NestedScrollView嵌套RecyclerView只显示一行的问题
- listview 中实现 checkb…
- java字符串与二进制的相互转…
- 关于java中Pattern.compile…
- nothing is impossible
- 【转载】BufferedReader的ready与r…
- mp4文件格式解析(一)
- TCP缓存