ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看直播体育app软件下载 >> Android开发 >> Android性能优化之被忽视的优化点

Android性能优化之被忽视的优化点(1/3)

来源:网络整理     时间:2015-11-25     关键词:性能优化,异常处理,Android开发,索引,数据操作

本篇文章主要介绍了"Android性能优化之被忽视的优化点",主要涉及到性能优化,异常处理,Android开发,索引,数据操作方面的内容,对于Android开发感兴趣的同学可以参考一下: 对于性能优化这个知识点来说,实在是太广了,博主本人也一直非常关注这方面的学习,而对于性能优化来说它包括了非常非常非常多方面,比如:I/O的优化、网络操作的优化、...

对于性能优化这个知识点来说,实在是太广了,博主本人也一直非常关注这方面的学习,而对于性能优化来说它包括了非常非常非常多方面,比如:I/O的优化、网络操作的优化、内存的优化、数据结构的优化、代码层次的优化、UI渲染优化、CPU资源使用率的优化、异常处理的优化等等等等。。。

本篇文章就博主本人的理解来讲述一些在Android开发中可以优化的地方

ArrayList和Vector

ArrayList和Vector都是内部以数组实现的List,它们两唯一的区别就是对多线程的支持,ArrayList是线程不安全的,而Vector内部对大多数方法都做了同步,是线程安全的,既然是线程安全的,所以性能方面肯定不如ArrayList了(当然想法肯定是对的),不过这需要看哪方面了,ArrayList在add、get、remove等操作效率肯定是高于Vector的,而在内存方面,Vector却比ArrayList表现的更好,这归根都是ArrayList的扩容策略导致的,稍后分析。

实现RandomAccess接口的集合使用fori遍历

先谈谈List集合的遍历方式,有三种:foreach、Iterator、fori。
而在开发中一般需要遍历时首选肯定是foreach了,因为它效率高,这个观点没错,不过需要分场合了。
下面是我用这三种方式测试遍历有100w条数据的ArrayList集合:

        long start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            data.get(i);
        }
        long end = System.currentTimeMillis();
        Log.v("zxy","fori花费:"+(end-start));

        start = System.currentTimeMillis();
        for (Integer integer : data) {

        }
        end = System.currentTimeMillis();
        Log.v("zxy","foreach花费:"+(end-start));

        Iterator Iterator = data.Iterator();
        start = System.currentTimeMillis();
        while (Iterator.hasNext()){
            Iterator.next();
        }
        end = System.currentTimeMillis();
        Log.v("zxy","Iterator花费:"+(end-start));
11-1909:11:44.2761418-1418/? V/zxy: fori花费:3011-1909:11:44.3801418-1418/? V/zxy: foreach花费:10511-1909:11:44.4761418-1418/? V/zxy: Iterator花费:95

而通常我们所说的效率高的foreach在遍历上却显得不如意,而fori效率表现的最好,这是因为ArrayList和Vector集合内部实现由数组实现,所以随机访问的速度是很快的,对于可以进行随机访问的List,JDK为它们实现了RandomAccess接口,表示支持快速随机访问。
而在遍历有1w条数据的LinkedList集合时:

11-1909:33:23.9841737-1737/? V/zxy: fori花费:35111-1909:33:23.9881737-1737/? V/zxy: foreach花费:211-1909:33:23.9921737-1737/? V/zxy: Iterator花费:4

则foreach表现最佳,所以对数组、或者实现了RandomAccess接口的List,遍历用fori性能最佳,对LinkedList等以链表实现的集合遍历时使用foreach或者Iterator性能最佳,因为foreach的实现就是通过Iterator实现的。
我们可以这样判断该List遍历用哪种方式:

if (listinstanceof RandomAccess)
        {
            for (int i = 0; i < list.size(); i++) {}
        } else {
            Iterator> Iterator = list.Iterator();
            while (Iterator.hasNext()) {
                Iterator.next();
            }
        }

预知容量的情况下构造ArrayList时尽量指定初始大小

ArrayList内部的扩容策略是当其所存储的元素数量超过它已有的大小时,它就会以1.5倍的容量进行扩容,也就是假如当前ArrayList的容量为10000,那么它在需要再存储一个元素时,即第10001个元素,由于容量不够而进行一次扩容,而ArrayList扩容后的容量则变为了15000,而多出了一个元素就多了5000个元素的空间,这太浪费内存资源了,而且扩容还会导致整个数组进行一次内存复制,而ArrayList集合默认大小为10,因此合理的设置ArrayList的容量可避免集合进行扩容。ArrayList内部扩容和数组复制代码为:

相关图片

相关文章