专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
开发者全社区  ·  “热巴”爸爸 ·  17 小时前  
开发者全社区  ·  董事长十几刀刺死 ... ·  22 小时前  
开发者全社区  ·  说乾隆也溜了? ·  昨天  
开发者全社区  ·  吃瓜!华x公司渣男天花板 ·  2 天前  
开发者全社区  ·  被三了 ·  2 天前  
51好读  ›  专栏  ›  安卓开发精选

Android性能优化之被忽视的优化点

安卓开发精选  · 公众号  · android  · 2017-01-14 21:17

正文

(点击 上方公众号 ,可快速关注)


来源:Sunzxyong

http://blog.csdn.net/u010687392/article/details/50035061

如有好文章投稿,请点击 → 这里了解详情


对于性能优化这个知识点来说,实在是太广了,博主本人也一直非常关注这方面的学习,而对于性能优化来说它包括了非常非常非常多方面,比如: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

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-19 09:11:44.276 1418-1418/? V/zxy: fori花费:30

11-19 09:11:44.380 1418-1418/? V/zxy: foreach花费:105

11-19 09:11:44.476 1418-1418/? V/zxy: iterator花费:95


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

而在遍历有1w条数据的LinkedList集合时:


11-19 09:33:23.984 1737-1737/? V/zxy: fori花费:351

11-19 09:33:23.988 1737-1737/? V/zxy: foreach花费:2

11-19 09:33:23.992 1737-1737/? V/zxy: iterator花费:4


则foreach表现最佳,所以对数组、或者实现了RandomAccess接口的List,遍历用fori性能最佳,对LinkedList等以链表实现的集合遍历时使用foreach或者iterator性能最佳,因为foreach的实现就是通过iterator实现的。

我们可以这样判断该List遍历用哪种方式:


if (list instanceof RandomAccess)

{

for (int i = 0; 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内部扩容和数组复制代码为:








请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  “热巴”爸爸
17 小时前
开发者全社区  ·  说乾隆也溜了?
昨天
开发者全社区  ·  吃瓜!华x公司渣男天花板
2 天前
开发者全社区  ·  被三了
2 天前
美国高中留学  ·  全美最难进的大学,虐不哭你算我输!
8 年前
教你学风水转运  ·  iPhone别再这么用!太耗电!
7 年前