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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值