Android性能优化包含很多方面,今天我们来看看对于数据结构如何做优化。
1.集合的遍历操作:
private void for1(ArrayList<Model> list){
long start = System.currentTimeMillis();
int len = list.size();
for(int i= 0;i < len;i++){
Model model = list.get(i);
model.getName();
model.getType();
}
long end = System.currentTimeMillis();
Log.d(TAG,"---for1 spend:" + (end - start) + "ms");
}
private void for2(ArrayList<Model> list){
long start = System.currentTimeMillis();
for(int i= 0;i < list.size();i++){
Model model = list.get(i);
model.getName();
model.getType();
}
long end = System.currentTimeMillis();
Log.d(TAG,"---for2 spend:" + (end - start) + "ms");
}
private void foreach(ArrayList<Model> list){
long start = System.currentTimeMillis();
for(Model m:list){
Model model = m;
model.getName();
model.getType();
}
long end = System.currentTimeMillis();
Log.d(TAG,"---foreach spend:" + (end - start) + "ms");
}
private void iterator(ArrayList<Model> list){
long start = System.currentTimeMillis();
Iterator<Model> it = list.iterator();
while (it.hasNext()){
Model model = it.next();
model.getName();
model.getType();
}
long end = System.currentTimeMillis();
Log.d(TAG,"---iterator spend:" + (end - start) + "ms");
}
D/CollectionActivity: ---for1 spend:65ms
D/CollectionActivity: ---for2 spend:77ms
D/CollectionActivity: ---foreach spend:117ms
D/CollectionActivity: ---iterator spend:118ms
计算发现:for1方法的便利速度最快,而改进for循环和Iterator遍历速度明显不如普通for循环速度,而普通for循环中若将list的长度声明为临时变量使用效果更佳。所以在使用ArrayList进行便利操作时尽量采用for1()方法的结构。
2.SpareArray替代HashMap< Integer,Object>
SpareArray是Android提供的类似Map结构的集合,为什么用SpareArray替代HashMap.我们先看一下SpareArray的结构:
public SparseArray(int initialCapacity) {
if (initialCapacity == 0) {
mKeys = EmptyArray.INT;
mValues = EmptyArray.OBJECT;
} else {
mValues = ArrayUtils.newUnpaddedObjectArray(initialCapacity);
mKeys = new int[mValues.length];
}
mSize = 0;
}
SpaseArray使用int类型做为key值,而HashMap的key值则必须为Integer,这样就导致在使用HashMap时创建了很多Integer对象。
3.ArrayList、LinkedList、Vector比较
ArrayList:线性不安全,可变数组,随机访问很快,删除非头尾元素慢
LinkedList:线性不安全,双链表,随机访问很慢,增删操作很快,不耗费多余资源
Vector:线性安全,可变数组,由于线性安全,所以操作效率低于ArrayList,但内存方面优于ArrayList。
ArrayList与Vector内存占用不同是由于两者的扩容机制不同造成的:
ArrayList:存储元素超过容器大小时,扩大1.5倍
@Override public boolean add(E object) {
Object[] a = array;
int s = size;
if (s == a.length) {
Object[] newArray = new Object[s +
(s < (MIN_CAPACITY_INCREMENT / 2) ?
MIN_CAPACITY_INCREMENT : s >> 1)];
System.arraycopy(a, 0, newArray, 0, s);
array = a = newArray;
}
a[s] = object;
size = s + 1;
modCount++;
return true;
}
Vector:按需扩容,每次加1,(elementCount++)
@Override
public synchronized boolean add(E object) {
if (elementCount == elementData.length) {
growByOne();
}
elementData[elementCount++] = object;
modCount++;
return true;
}
由此比较,在内存方面Vector表现比ArrayList要好。