三种循环的性能比较
2016-04-12 21:27
323 查看
下面是一段测试代码:
第一种循环是最经典的 for 循环
第二种循环是 Iterator 循环
第三种循环是 for-each 循环
下面是三种循环所需要的时间:
很显然第一种循环的效率最高,第二种次之,第三种最差。隐约记得,在刚工作的时候带我的师傅说最好用 for-each 循环,代码简洁,效率还高,我一直以为也是这样。
今天,我看了 RandomAccess 接口的文档说明,文档中明确说明了实现了 RandomAccess 接口的类使用经典的 for 循环要比使用 Iterator 循环更快(ArrayLis 实现了 RandomAccess 接口)。动手试了下果然如此,for-each 循环的底层也是使用了 Iterator ,只是对 Iterator 进行了包装。
下面是另一段代码,除了第一行和循环的大小不同外其余的地方都相同。上一个例子中 List 的实现是 ArrayList ,下面的例子中 List 的实现是 LinkedList 。
下面是三种循环所需要的时间:
在这种情况下经典的 for 循环要比另外两种循环慢的多。文档中说了,实现了 RandomAccess 接口的类使用经典的循环要比 Iterator 循环要快。ArrayList 实现了 RandomAccess 接口,但 LinkedList 并没有实现 RandomAccess 接口。由于 ArrayList 的底层实现是数组,通过下标常量时间访问,访问快, LinkedList 底层实现是链表,访问时间的平均长度与 LinkedList 的容量成正比,是线性访问时间,所以慢。
List<Integer> integers = new ArrayList<Integer>(); for (int i = 0; i < 10000000; i++) { integers.add(i); } long l1 = System.currentTimeMillis(); for (int i = 0; i < integers.size(); i++) { integers.get(i); } long l2 = System.currentTimeMillis(); System.out.println(l2 - l1); Iterator<Integer> iterator = integers.iterator(); while (iterator.hasNext()) { iterator.next(); } long l3 = System.currentTimeMillis(); System.out.println(l3-l2); for (Integer i : integers) { } System.out.println(System.currentTimeMillis()-l3); }
第一种循环是最经典的 for 循环
第二种循环是 Iterator 循环
第三种循环是 for-each 循环
下面是三种循环所需要的时间:
很显然第一种循环的效率最高,第二种次之,第三种最差。隐约记得,在刚工作的时候带我的师傅说最好用 for-each 循环,代码简洁,效率还高,我一直以为也是这样。
今天,我看了 RandomAccess 接口的文档说明,文档中明确说明了实现了 RandomAccess 接口的类使用经典的 for 循环要比使用 Iterator 循环更快(ArrayLis 实现了 RandomAccess 接口)。动手试了下果然如此,for-each 循环的底层也是使用了 Iterator ,只是对 Iterator 进行了包装。
下面是另一段代码,除了第一行和循环的大小不同外其余的地方都相同。上一个例子中 List 的实现是 ArrayList ,下面的例子中 List 的实现是 LinkedList 。
public static void main(String[] args) { List<Integer> integers = new LinkedList<Integer>(); for (int i = 0; i < 100000; i++) { integers.add(i); } long l1 = System.currentTimeMillis(); for (int i = 0; i < integers.size(); i++) { integers.get(i); } long l2 = System.currentTimeMillis(); System.out.println(l2 - l1); Iterator<Integer> iterator = integers.iterator(); while (iterator.hasNext()) { iterator.next(); } long l3 = System.currentTimeMillis(); System.out.println(l3-l2); for (Integer i : integers) { } System.out.println(System.currentTimeMillis()-l3); }
下面是三种循环所需要的时间:
在这种情况下经典的 for 循环要比另外两种循环慢的多。文档中说了,实现了 RandomAccess 接口的类使用经典的循环要比 Iterator 循环要快。ArrayList 实现了 RandomAccess 接口,但 LinkedList 并没有实现 RandomAccess 接口。由于 ArrayList 的底层实现是数组,通过下标常量时间访问,访问快, LinkedList 底层实现是链表,访问时间的平均长度与 LinkedList 的容量成正比,是线性访问时间,所以慢。
相关文章推荐
- C++插入排序算法
- iOS之即时通讯相关理解
- nyoj 998
- 尚硅谷·网上书城项目(四)
- 含有指针成员时的赋值运算符重载
- 如何分析、定位Android Native Crash
- 输入与输出
- Android大图轮播-学习笔记
- nyoj 998
- IOS中用到的缓存
- IOS中用到的缓存
- c++作业3
- 子线程网络图片查看器和Handler消息处理器
- node学习之express(1)
- 【Leetcode】:Single Number III问题 in Go语言
- 剑指offer系列之45:圆圈中最后剩下的数字
- 216. Combination Sum III
- C++中虚函数的作用是什么?它应该怎么用呢?
- Android消息机制探索(Handler,Looper,Message,MessageQueue)
- hdu 5178 pairs