美文网首页
java小知识:for和foreach哪个更快

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

作者: 程序员日志 | 来源:发表于2017-08-29 00:38 被阅读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的优点是代码的可读性更强,但缺点是没有索引,在需要索引操作时候显得很不方便。

相关文章

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

    无论是数组的循环遍历,或者是列表的循环遍历,在实际工程中都是十分常见的。对于java来说,除了常见的for循...

  • JAVA for 和foreach

    结论: for更高效、foreach更安全在遍历过程中有可能对数据进行修改的情况下使用foreach只在线程内的临...

  • 高效遍历Java容器

    通过本文,你可以更深入的学习 Java 语言中 forEach 语法的知识,以及它和 C 语言形式的 for 循环...

  • 高效遍历Java容器

    通过本文,你可以更深入的学习 Java 语言中 forEach 语法的知识,以及它和 C 语言形式的 for 循环...

  • 高效遍历Java容器

    通过本文,你可以更深入的学习 Java 语言中 forEach 语法的知识,以及它和 C 语言形式的 for 循环...

  • 高效遍历Java容器

    通过本文,你可以更深入的学习 Java 语言中 forEach 语法的知识,以及它和 C 语言形式的 for 循环...

  • Java8 forEach

    Java8 forEach Java forEach 是一种实用程序方法,用于迭代集合(如列表、集或映射)和流,并...

  • Java 几种循环方式

    1、java循环分类 Iterator、for、foreach、Stream.forEach 2、java迭代器I...

  • [Unity优化] unity性能优化规范

    和java不同 能用for就不用foreach,因为foreach会使用迭代器并会产生额外几kb的gc。 和fin...

  • 使用Lambda表达式遍历集合

    知识点 Iterable.forEach(Consumer action)是在Java 8中新增的方法,Consu...

网友评论

      本文标题:java小知识:for和foreach哪个更快

      本文链接:https://www.haomeiwen.com/subject/pkmndxtx.html