91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java循環中的For和For-each應用對比分析

發布時間:2022-08-17 10:11:53 來源:億速云 閱讀:122 作者:iii 欄目:開發技術

這篇文章主要介紹“Java循環中的For和For-each應用對比分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java循環中的For和For-each應用對比分析”文章能幫助大家解決問題。

for-each實現方法

For-each不是一種新語法,而是Java的語法糖。在編譯時,編譯器將此代碼轉換為迭代器實現,并將其編譯為字節碼。我們可以通過執行命令javap-verbose-Testforeach反編譯以下編譯代碼:

public class TestForeach {
    List<Integer> integers;
    public void testForeach(){
        for(Integer i : integers){

        }
    }
}

獲得的詳細字節碼如下:

public void testForeach();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=3, args_size=1
         0: aload_0
         1: getfield      #2                  // Field integers:Ljava/util/List;
         4: invokeinterface #3,  1            // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
         9: astore_1
        10: aload_1
        11: invokeinterface #4,  1            // InterfaceMethod java/util/Iterator.hasNext:()Z
        16: ifeq          32
        19: aload_1
        20: invokeinterface #5,  1            // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
        25: checkcast     #6                  // class java/lang/Integer
        28: astore_2
        29: goto          10
        32: return
      LineNumberTable:
        line 11: 0
        line 13: 29
        line 14: 32
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
           29       0     2     i   Ljava/lang/Integer;
            0      33     0  this   Ltest/TestForeach;
}

此字節碼的一般含義是使用getfileld命令來獲取integers變量并且調用List.iterator來獲取迭代器實例和調用iterator.hasNext。如果返回true,調用iterator.next方法。

請看,這是迭代器遍歷集合的實現邏輯。

基準測試

現在讓我們使用for循環方法和for-each方法進行測試。

public class ForLoopTest {

    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            arrayList.add(i);
        }

        long arrayListStartTime = System.currentTimeMillis();
        for (int i = 0; i < arrayList.size(); i++) {
            arrayList.get(i);
        }

        long arrayListCost =System.currentTimeMillis()-arrayListStartTime;
        System.out.println("ArrayList for loop traversal cost: "+ arrayListCost);

        long arrayListForeachStartTime = System.currentTimeMillis();
        for (Integer integer : arrayList) {

        }

        long arrayListForeachCost =System.currentTimeMillis()-arrayListForeachStartTime;
        System.out.println("ArrayList foreach traversal cost: "+ arrayListForeachCost);

這是測試結果:

Java循環中的For和For-each應用對比分析

如你所見,結果是顯而易見的。對于ArrayList,使用For循環方法的性能優于For each方法。

我們可以說for循環比for-each好嗎?

答案是否定的。在下一個基準測試中,我們將ArrayList更改為LinkedList。
同樣,這里是測試結果。

Java循環中的For和For-each應用對比分析

原因分析

一些初學者可能想知道為什么ArrayList使用for循環方法遍歷得更快,而LinkedList則更慢,速度也非常慢?

這由ArrayList和LinkedList數據結構決定。
ArrayList底層使用數組存儲元素。數組是連續的內存空間。數據可以通過索引獲得。時間復雜度為O(1),因此速度很快。

LinkedList的底層是一個雙向鏈表。使用for循環實現遍歷,每次都需要從鏈表的頭節點開始。時間復雜度為O(n*n)。

結論

  • 使用ArrayList時,for循環方法更快,因為for-each由迭代器實現,并且需要執行并發修改驗證。

  • 使用LinkedList時,for-each比for循環快得多,因為LinkedList是通過使用雙向鏈表實現的。每個尋址都需要從頭節點開始。如果我們需要遍歷LinkedList,我們需要避免使用for循環。

  • 使用迭代器模式,for-each不需要關心集合的具體實現。如果需要替換集合,無需修改代碼即可輕松替換。

關于“Java循環中的For和For-each應用對比分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永仁县| 辰溪县| 廉江市| 靖宇县| 若尔盖县| 凯里市| 宣化县| 侯马市| 舟山市| 辛集市| 秦皇岛市| 通州区| 宜兰市| 林芝县| 太康县| 本溪市| 隆昌县| 黄浦区| 广河县| 周宁县| 中方县| 鄂温| 嘉善县| 长寿区| 敖汉旗| 洞头县| 龙南县| 蕉岭县| 准格尔旗| 桐柏县| 长寿区| 中宁县| 宜君县| 林芝县| 溆浦县| 梅州市| 永新县| 扬州市| 盐山县| 拉孜县| 中方县|