ArrayList的for遍历和下标遍历的效率分析

原创
2017/03/18 07:58
阅读数 835

因为List是有下标的,所以遍历的时候可以用增强for循环也可以用下标来遍历,那么这两个方式到底哪个效率更高呢?我们来假设一个模型,我们要计算一个380万条成绩的数据,我们放在ArrayList里面,然后再用遍历取值相加除以总数(当然sql语句有函数可以直接得出,这里为了测试方便,用java来实现),下面请看测试的程序。

ArrayList的for遍历和下标遍历的效率分析

程序比较简单这里就不介绍了,得出增强for循环遍历取平均的时间为21ms,下面看看下标遍历的时间。

ArrayList的for遍历和下标遍历的效率分析

可以看到这边仅仅是取值出来相加的运算就相差了9ms,那么这是为什么呢?

因为ArrayList实现了RandomAccess接口(随机存取接口),这也就标志着ArrayList是一个可以随机存取的列表。在java中,RandomAccess和Cloneable、Serializable一样,都是标志性接口,不需要任何实现,只是用来表明其实现类具有某种特性,实现了Cloneable表示这个类可以被拷贝,而实现了Serializable接口表明被序列化,同理实现了RandomAccess则表明这个类可以随机存取,对ArrayList来说也就标志着数据元素之间没有关联,即两个位置相邻的元素之间没有相互依赖或者索引的关系,可以随机的访问和存储。

而在java中的增强for循环是迭代器的变形用法,也就是可以用for(Iterator<Integer> i=list.iterator;i.hasNext();){sum+=i.next();}。也就是说在这边为了使用迭代器,需要强制建立一种相互联系的关系,比如上一个元素可以判断是否有下一个元素,以及下一个元素是什么等关系,所以在这边就是用增强for循环耗时的原因了。

所以我们在遍历ArrayList的时候,可以选择下标遍历的方式会更高效一点~~~。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部