天天看點

java 普通for循環與增強for循環的性能對比

有些人循環用的是普通for循環,

有些人用的是增強for循環,

它們之間有什麼差別?應該在什麼時候使用這兩種循環了?

==========文法格式==========

普通for循環文法:

for (int i = 0; i < integers.length; i++) {  
    System.out.println(intergers[i]);  
}  
           

增強for循環文法:

for(Integer in : integers){  
    System.out.println(in);  
}  
           

今天我們來比較一下兩種for循環對ArrayList和LinkList集合的循環性能比較。首先簡單的了解一下ArrayList和LinkList的差別:

ArrayList是采用數組的形式儲存對象的,這種方式将對象放在連續的記憶體塊中,是以插入和删除時比較麻煩,查詢比較友善。

LinkList是将對象放在獨立的空間中,而且每個空間中還儲存下一個空間的索引,也就是資料結構中的連結清單結構,插入和删除比較友善,但是查找很麻煩,要從第一個開始周遊。

将ArrayList和LinkList分别插入10萬條記錄

測試代碼:

package utils;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ForEach {
    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<Integer>();
        List<Integer> linkList = new LinkedList<Integer>();
        // 每個集合插入10萬條資料
        for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
            linkList.add(i);
        }

        int arry = 0;

        System.out.println("============周遊arrayList============");

        // 用for循環arrayList
        long forStartTime = System.currentTimeMillis();
        for (int i = 0; i < arrayList.size(); i++) {
            arry = arrayList.get(i);
        }
        long forEndTime = System.currentTimeMillis();
        System.out.println("for周遊需要:" + (forEndTime - forStartTime) + "毫秒");


        // 用增強for循環arrayList
        long forUpStartTime = System.currentTimeMillis();
        for (Integer in : arrayList) {
            arry = in;
        }
        long forUpEndTime = System.currentTimeMillis();
        System.out.println("增強for周遊需要:" + (forUpEndTime - forUpStartTime) + "毫秒");


        System.out.println("============linkList============");

        // 用for循環linkList
        long linkForStartTime = System.currentTimeMillis();
        int link = 0;
        for (int i = 0; i < linkList.size(); i++) {
            link = linkList.get(i);
        }
        long linkForEndTime = System.currentTimeMillis();
        System.out.println("for周遊:" + (linkForEndTime - linkForStartTime) + "毫秒");

        // 用增強for循環linkList
        long linkForeachStartTime = System.currentTimeMillis();
        for (Integer in : linkList) {
            link = in;
        }
        long linkForeachEndTime = System.currentTimeMillis();
        System.out.println("用增強for周遊需要:" + (linkForeachEndTime - linkForeachStartTime) + "毫秒");

    }
}
           

運作結果:

java 普通for循環與增強for循環的性能對比

可以看出,循環ArrayList時,普通for循環比foreach循環花費的時間要少一點;循環LinkList時,普通for循環比foreach循環花費的時間要多很多。當我将循環次數提升到一百萬次的時候,循環ArrayList,普通for循環還是比foreach要快一點;但是普通for循環在循環LinkList時,程式直接卡死。

結論:需要循環數組結構的資料時,建議使用普通for循環,因為for循環采用下标通路,對于數組結構的資料來說,采用下标通路比較好。

需要循環連結清單結構的資料時,一定不要使用普通for循環,這種做法很糟糕,資料量大的時候有可能會導緻系統崩潰。