Android性能优化——数据结构的优化

来源:互联网 发布:上海交通大学学报知乎 编辑:程序博客网 时间:2024/06/05 02:49

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要好。

0 0
原创粉丝点击