Java for循环和foreach循环的性能比较

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

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

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

不少时候咱们很天然的认为,for循环的时候使用foreach和原来的for循环用下标的方式遍历是相同的。数据结构

并且由于foreach循环写法简单,很容易理解,并且少去了不少麻烦的变量,因此估计在学会使用foreach循环以后,不少人就没有用过下标的循环了。dom

可是你知道二者其实仍是有很大区别的,在不一样的状况下面应该使用不一样的方式去循环。spa

不然会致使循环的时间变长。数据量小的时候固然没有什么关系,可是一旦数据量大了以后问题就会暴露出来了。设计

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

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

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

上面两种写法意思实际上是同样的blog

其实就是利用了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时,程序直接卡死。