java小知识:for和foreach哪个更快

2017-08-29  本文已影响0人  程序员日志

       无论是数组的循环遍历,或者是列表的循环遍历,在实际工程中都是十分常见的。对于java来说,除了常见的for循环之外,还有所谓的foreach,即增强型for循环。在对两者进行比较之前,先介绍一下foreach的底层原理。
       foreach本质上是java中的语法糖,对数组操作时,底层原理和普通的for循环一样;而对列表操作时,实际上是采用了迭代器的方法。下面我们分别对数组int[]以及两种列表类型ArrayList和LinkedList进行时间测试,代码如下所示:

import java.util.*;
public class Main {
    private static int length = 100000;
    private static int number = 10;
    public static void main(String[] args) {
        int[] array = new int[length];
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new LinkedList<>();
        for (int i = 0; i < length; i++) {
            list1.add(i);
            list2.add(i);
        }
        long[] times = new long[6];
        for (int i = 0; i < number; i++) {
            times[0] += forArrayTime(array);
            times[1] += foreachArrayTime(array);
            times[2] += forListTime(list1);
            times[3] += foreachListTime(list1);
            times[4] += forListTime(list2);
            times[5] += foreachListTime(list2);
        }
        System.out.println(String.format("for循环执行数组int[]的时间为:%s", times[0]/10));
        System.out.println(String.format("foreach执行数组int[]的时间为:%s", times[1]/10));
        System.out.println(String.format("for循环执行ArrayList的时间为:%s", times[2]/10));
        System.out.println(String.format("foreach执行ArrayList的时间为:%s", times[3]/10));
        System.out.println(String.format("for循环执行LinkedList的时间为:%s", times[4]/10));
        System.out.println(String.format("foreach执行LinkedList的时间为:%s", times[5]/10));
    }

    private static long forArrayTime(int[] array) {
        long start = System.nanoTime();
        for (int i = 0; i < length; i++) {
            testTime(array[i]);
        }
        return System.nanoTime() - start;
    }

    private static long foreachArrayTime(int[] array) {
        long start = System.nanoTime();
        for (int i : array) {
            testTime(i);
        }
        return System.nanoTime() - start;
    }

    private static long forListTime(List<Integer> list) {
        long start = System.nanoTime();
        for (int i = 0; i < length; i++) {
            testTime(list.get(i));
        }
        return System.nanoTime() - start;
    }

    private static long foreachListTime(List<Integer> list) {
        long start = System.nanoTime();
        for (int i : list) {
            testTime(i);
        }
        return System.nanoTime() - start;
    }

    private static void testTime(Integer num) {}
}

运行10次取平均值,输出结果如下:

for循环执行数组int[]的时间为:263990
foreach执行数组int[]的时间为:809164
for循环执行ArrayList的时间为:1371229
foreach执行ArrayList的时间为:1993637
for循环执行LinkedList的时间为:6154382234
foreach执行LinkedList的时间为:1197516

       可以看出,对于数组和数组列表而言,for循环比foreach的执行效率稍高。但对于随机读取比较慢的链表而言,迭代器模式的foreach比for循环要快得多。如果不考虑速度的影响,foreach的优点是代码的可读性更强,但缺点是没有索引,在需要索引操作时候显得很不方便。

上一篇下一篇

猜你喜欢

热点阅读