关于for循环与for-each的效率比较
2017-03-13 17:57
399 查看
在翻看Java相关的面试题时看到一个问题,普通for循环和for-each的效率孰优孰劣?
于是写了一个简单的例子做了一些对比,如下:
实验中,分别使用了ArrayList和LinkedList作为操作对象,结果如下:
=======对ArrayList操作=======
空循环耗时:27ms
普通for循环,使用get()耗时:126ms
for-each耗时:257ms
使用Iterator耗时:180ms
=======对LinkedList操作=======
空循环耗时:2ms
普通for循环,使用get()耗时:3495ms
for-each耗时:3ms
使用Iterator耗时:3ms
Process finished with exit code 0
由运行结果可以看出,若以ArrayList作为操作对象,for-each的效率比普通for循环低许多,但是若以LinkedList作为操作对象,for-each的效率与普通for循环的效率不在一个量级,原因也是因为对LinkedList使用了get(index),导致每次访问数据需从链表头开始遍历,耗时增加。
于是写了一个简单的例子做了一些对比,如下:
package com.yummy.nowcoder; import java.util.ArrayList; import java.util.Calendar; import java.util.Iterator; import java.util.LinkedList; /** * Created by qq985 on 2017/3/13. */ public class TestForTime { public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<>(); for (int i = 0; i < 100000000; i++) { arrayList.add(1); } long startTime; long endTime; System.out.println("=======对ArrayList操作======="); startTime = Calendar.getInstance().getTimeInMillis(); int size = arrayList.size(); for (int i = 0; i < size; i++) { } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("空循环耗时:" + (endTime - startTime)+"ms"); startTime = Calendar.getInstance().getTimeInMillis(); int size2 = arrayList.size(); for (int i = 0; i < size2; i++) { int iValue = arrayList.get(i); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("普通for循环,使用get()耗时:" + (endTime - startTime)+"ms"); startTime = Calendar.getInstance().getTimeInMillis(); for (int iValue : arrayList) { } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("for-each耗时:" + (endTime - startTime)+"ms"); startTime = Calendar.getInstance().getTimeInMillis(); Iterator iterator = arrayList.iterator(); while (iterator.hasNext()) { int iValue = (int) iterator.next(); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("使用Iterator耗时:" + (endTime - startTime)+"ms"); LinkedList<Integer> linkedList = new LinkedList<>(); for (int i = 0; i < 100000; i++) { linkedList.add(1); } System.out.println("=======对LinkedList操作======="); startTime = Calendar.getInstance().getTimeInMillis(); int size3 = linkedList.size(); for (int i = 0; i < size3; i++) { } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("空循环耗时:" + (endTime - startTime)+"ms"); startTime = Calendar.getInstance().getTimeInMillis(); int size4 = linkedList.size(); for (int i = 0; i < size4; i++) { int iValue = linkedList.get(i); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("普通for循环,使用get()耗时:" + (endTime - startTime)+"ms"); startTime = Calendar.getInstance().getTimeInMillis(); for (int iValue : linkedList) { } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("for-each耗时:" + (endTime - startTime)+"ms"); startTime = Calendar.getInstance().getTimeInMillis(); Iterator iterator2 = linkedList.iterator(); while (iterator2.hasNext()) { int iValue = (int) iterator2.next(); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("使用Iterator耗时:" + (endTime - startTime)+"ms"); } }
实验中,分别使用了ArrayList和LinkedList作为操作对象,结果如下:
=======对ArrayList操作=======
空循环耗时:27ms
普通for循环,使用get()耗时:126ms
for-each耗时:257ms
使用Iterator耗时:180ms
=======对LinkedList操作=======
空循环耗时:2ms
普通for循环,使用get()耗时:3495ms
for-each耗时:3ms
使用Iterator耗时:3ms
Process finished with exit code 0
由运行结果可以看出,若以ArrayList作为操作对象,for-each的效率比普通for循环低许多,但是若以LinkedList作为操作对象,for-each的效率与普通for循环的效率不在一个量级,原因也是因为对LinkedList使用了get(index),导致每次访问数据需从链表头开始遍历,耗时增加。
相关文章推荐
- 关于执行两个for循环效率注意点
- for、foreach和MoveNext循环效率粗比较
- for 循环性能比较 提高for循环的效率
- 循环执行时间JQuery 性能分析系列一 —— for与each性能比较
- PHP 数组的遍历的几种方式(以及foreach与for/while+each效率的比较)
- 关于for循环的执行效率问题
- for 循环性能比较 提高for循环的效率
- C#循环效率比较 Item6 - Prefer 'for' over 'foreach'. [Performance]
- for循环和递归算法的运行效率比较(c语言)
- forEach、for、$.each()跳出循环比较
- 请教下关于For循环和mysql的IN查询哪种效率高一些?
- AS3 中的 for each in 效率比较
- 关于for循环的执行效率的问题
- for 循环性能比较 提高for循环的效率
- 递归求和(Recursive)与for循环求和效率问题的简单比较
- php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较
- for each in 用法举例 asp中如何循环取出split中的值
- 关于PHP中for循环语句的几种变型
- 关于For循环的学习
- WaitForSingleObject 和 EnterCriticalSection 效率比较