zoukankan      html  css  js  c++  java
  • Java for循环和foreach循环的性能比较

    前言
    从JDK1.5起,增加了新功能Foreach,它是for循环遍历数据的一种简写形式,使用的关键字依然是for,但参数格式不同。其详细用法为:

    for(Type e:collection){
        //对变量e的使用
    }

    参数说明:
    e:其类型Type是集合或数组中元素值的类型,该参数是集合或数组collection中的一个元素。
    collections: 要遍历的集合或数组,也可以是迭代器。

    很多时候我们很自然的认为,for循环的时候使用foreach和原来的for循环用下标的方式遍历是相同的。

    而且因为foreach循环写法简单,很容易理解,而且少去了很多麻烦的变量,所以估计在学会使用foreach循环之后,很多人就没有用过下标的循环了。

    但是你知道两者其实还是有很大区别的,在不同的情况下面应该使用不同的方式去循环。

    否则会导致循环的时间变长。数据量小的时候当然没有什么关系,但是一旦数据量大了之后问题就会暴露出来了。

    首先我们要知道的时候foreach循环是利用迭代器的使用循环。那么什么是迭代器呢?

    提供一种方法访问一个容器对象的各个元素,同时又无需暴露该对象的内部细节,这是设计模式中的一种解释。

    forint i:list)
    
    for(Iterator<Integer> i=list.iterator();i.hasNext();)

    上面两种写法意思其实是一样的

    其实就是利用了hasNext方法实现了foreach循环

    知道了什么是foreach循环,那么什么时候去使用,也就好解释了。

    然后需要知道的是什么是RandomAccess接口,ArrayList数组实现了这个接口,这个接口是随机存取接口。

    实现了这个接口就表示内部的存放是随机的,但是foreach循环需要需要使用next方法获取下一个元素,而随机存放的话就需要强制建立前后的联系。

    所以在循环ArrayList的时候使用下标去循环会比foreach循环要快。

    下面说List<>,对于这个链表类似的有很多数据结构,LinkedList什么的,很多,他们存放本身就是有联系的,所以对于他们来说,next方法很容易就找到下一个元素的了,所以循环的时候使用foreach很快。

    public class Test {
    
        public static void main(String[] args) {
    
            //实例化arrayList
            List<Integer> arrayList = new ArrayList<Integer>();
            //实例化linkList
            List<Integer> linkList = new LinkedList<Integer>();
    
            //插入10万条数据
            for (int i = 0; i < 100000; i++) {
                arrayList.add(i);
                linkList.add(i);
            }
    
            Integer array = 0;
            //用for循环arrayList
            long arrayForStartTime = System.currentTimeMillis();
            for (int i = 0; i < arrayList.size(); i++) {
                array = arrayList.get(i);
            }
            long arrayForEndTime = System.currentTimeMillis();
            System.out.println("用for循环arrayList 10万次花费时间:" + (arrayForEndTime - arrayForStartTime) + "毫秒");
    
            //用foreach循环arrayList
            long arrayForeachStartTime = System.currentTimeMillis();
            for (Integer in : arrayList) {
                array = in;
            }
            long arrayForeachEndTime = System.currentTimeMillis();
            System.out.println("用foreach循环arrayList 10万次花费时间:" + (arrayForeachEndTime - arrayForeachStartTime) + "毫秒");
    
            //用for循环linkList
            long linkForStartTime = System.currentTimeMillis();
            Integer link = 0;
            for (int i = 0; i < linkList.size(); i++) {
                link = linkList.get(i);
            }
            long linkForEndTime = System.currentTimeMillis();
            System.out.println("用for循环linkList 10万次花费时间:" + (linkForEndTime - linkForStartTime) + "毫秒");
    
            //用froeach循环linkList
            long linkForeachStartTime = System.currentTimeMillis();
            for (Integer in : linkList) {
                link = in;
            }
            long linkForeachEndTime = System.currentTimeMillis();
            System.out.println("用foreach循环linkList 10万次花费时间:" + (linkForeachEndTime - linkForeachStartTime) + "毫秒");
        }
    }

    运行结果:

    用for循环arrayList 10万次花费时间:2毫秒
    用foreach循环arrayList 10万次花费时间:6毫秒
    用for循环linkList 10万次花费时间:4244毫秒
    用foreach循环linkList 10万次花费时间:2毫秒

    可以看出,循环ArrayList时,普通for循环比foreach循环花费的时间要少一点;循环LinkList时,普通for循环比foreach循环花费的时间要多很多。

    当我将循环次数提升到一百万次的时候,循环ArrayList,普通for循环还是比foreach要快一点;但是普通for循环在循环LinkList时,程序直接卡死。

  • 相关阅读:
    第二十一章 PHP编译安装(centos7)
    第二十章 nginx常见问题
    第十九章 keepalived高可用
    dijkstra
    求逆序对
    A
    P2014 [CTSC1997]选课
    樱花 混合背包
    1401D
    CF1343D
  • 原文地址:https://www.cnblogs.com/winner-0715/p/7363725.html
Copyright © 2011-2022 走看看