關於普通for循環和增強for循環

什麼時候使用普通for循環,什麼時候使用增強for循環

首先,增強for循環的寫法比普通for循環簡便,不過我們還得考慮效率。

--->首先,我們先看結論:

對於基本數組類的遍歷,兩者的效率是相同的;

對於ArrayList的遍歷,普通for循環的效率高於增強for循環;

對於LinkedList的遍歷,增強for循環的效率高於普通for循環。

 

--->然後,我們來看驗證:

        int[] intArray = new int[100000];
        List<Integer> intArrayList = new ArrayList<>();
        List<Integer> intLinkedList = new LinkedList<>();
        for (int i = 0; i < 100000; i++) {
            intArray[i] = i;
            intArrayList.add(i);
            intLinkedList.add(i);
        }
        
        int a = 0;
        
        System.out.println("======遍歷stringArray======");
        
        //用for循環stringArray
        long forStartTime = System.currentTimeMillis();
        for (int i = 0; i < intArray.length; i++) {
            a = intArray[i];
        }
        long forEndTime = System.currentTimeMillis();
        System.out.println("普通for循環需要:" + (forEndTime - forStartTime) + "毫秒");

        //用增強for循環stringArray
        long forUpStartTime = System.currentTimeMillis();
        for (Integer i: intArray) {
            a = i;
        }
        long forUpEndTime = System.currentTimeMillis();
        System.out.println("增強for循環需要:" + (forUpEndTime - forUpStartTime) + "毫秒");

        System.out.println("======遍歷stringArrayList======");

        //用for循環stringArrayList
        long forStartTime2 = System.currentTimeMillis();
        for (int i = 0; i < intArrayList.size(); i++) {
            a = intArrayList.get(i);
        }
        long forEndTime2 = System.currentTimeMillis();
        System.out.println("普通for循環需要:" + (forEndTime2 - forStartTime2) + "毫秒");

        //用增強for循環stringArrayList
        long forUpStartTime2 = System.currentTimeMillis();
        for (Integer i: intArrayList) {
            a = i;
        }
        long forUpEndTime2 = System.currentTimeMillis();
        System.out.println("增強for循環需要:" + (forUpEndTime2 - forUpStartTime2) + "毫秒");

        System.out.println("======遍歷stringLinkedList======");

        //用for循環stringLinkedList
        long forStartTime3 = System.currentTimeMillis();
        for (int i = 0; i < intLinkedList.size(); i++) {
            a = intLinkedList.get(i);
        }
        long forEndTime3 = System.currentTimeMillis();
        System.out.println("普通for循環需要:" + (forEndTime3 - forStartTime3) + "毫秒");

        //用增強for循環stringLinkedList
        long forUpStartTime3 = System.currentTimeMillis();
        for (Integer i: intLinkedList) {
            a = i;
        }
        long forUpEndTime3 = System.currentTimeMillis();
        System.out.println("增強for循環需要:" + (forUpEndTime3 - forUpStartTime3) + "毫秒");
I/System.out: ======遍歷stringArray======
I/System.out: 普通for循環需要:1毫秒
I/System.out: 增強for循環需要:1毫秒
I/System.out: ======遍歷stringArrayList======
I/System.out: 普通for循環需要:2毫秒
I/System.out: 增強for循環需要:2毫秒
I/System.out: ======遍歷stringLinkedList======
I/System.out: 普通for循環需要:4411毫秒
I/System.out: 增強for循環需要:6毫秒

可以佐證上述結論。

並且我們尤其需要關注:

使用LinkedList時,普通for循環比增強for循環花費的時間要多很多,甚至會導致程序直接卡死。

 

寫在最後:

ArrayList是採用數組的形式保存對象的,這種方式將對象放在連續的內存塊中,所以插入和刪除時比較麻煩,

查詢比較方便。

LinkedList是將對象放在獨立的空間中,而且每個空間中還保留下一個空間的索引,也就是數據結構中的鏈表結構,

插入和刪除比較方便,但是查找很麻煩,要從第一個開始遍歷。

至於爲什麼使用LinkedList時,普通for循環耗時比增強for循環多那麼多,這是因爲他們的實現不同,具體可以參考

下面這篇文章https://www.jianshu.com/p/f770ea3e7181

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章