最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java循環(huán)中的For和For-each哪個(gè)更快

 更新時(shí)間:2022年08月17日 08:10:57   作者:愚生淺末  
本文主要介紹了淺談Java循環(huán)中的For和For-each哪個(gè)更快,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

對(duì)于Java循環(huán)中的For和For-each,哪個(gè)更快

通過(guò)本文,您可以了解一些集合遍歷技巧。

Java遍歷集合有兩種方法。一個(gè)是最基本的for循環(huán),另一個(gè)是jdk5引入的for each。通過(guò)這種方法,我們可以更方便地遍歷數(shù)組和集合。但是你有沒有想過(guò)這兩種方法?哪一個(gè)遍歷集合更有效?

for-each實(shí)現(xiàn)方法

For-each不是一種新語(yǔ)法,而是Java的語(yǔ)法糖。在編譯時(shí),編譯器將此代碼轉(zhuǎn)換為迭代器實(shí)現(xiàn),并將其編譯為字節(jié)碼。我們可以通過(guò)執(zhí)行命令javap-verbose-Testforeach反編譯以下編譯代碼:

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

        }
    }
}

獲得的詳細(xì)字節(jié)碼如下:

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;
}

此字節(jié)碼的一般含義是使用getfileld命令來(lái)獲取integers變量并且調(diào)用List.iterator來(lái)獲取迭代器實(shí)例和調(diào)用iterator.hasNext。如果返回true,調(diào)用iterator.next方法。

請(qǐng)看,這是迭代器遍歷集合的實(shí)現(xiàn)邏輯。

基準(zhǔn)測(cè)試

現(xiàn)在讓我們使用for循環(huán)方法和for-each方法進(jìn)行測(cè)試。

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);

這是測(cè)試結(jié)果:

如你所見,結(jié)果是顯而易見的。對(duì)于ArrayList,使用For循環(huán)方法的性能優(yōu)于For each方法。

我們可以說(shuō)for循環(huán)比f(wàn)or-each好嗎?

答案是否定的。在下一個(gè)基準(zhǔn)測(cè)試中,我們將ArrayList更改為L(zhǎng)inkedList。
同樣,這里是測(cè)試結(jié)果。

原因分析

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

這由ArrayList和LinkedList數(shù)據(jù)結(jié)構(gòu)決定。
ArrayList底層使用數(shù)組存儲(chǔ)元素。數(shù)組是連續(xù)的內(nèi)存空間。數(shù)據(jù)可以通過(guò)索引獲得。時(shí)間復(fù)雜度為O(1),因此速度很快。

LinkedList的底層是一個(gè)雙向鏈表。使用for循環(huán)實(shí)現(xiàn)遍歷,每次都需要從鏈表的頭節(jié)點(diǎn)開始。時(shí)間復(fù)雜度為O(n*n)。

結(jié)論

  • 使用ArrayList時(shí),for循環(huán)方法更快,因?yàn)閒or-each由迭代器實(shí)現(xiàn),并且需要執(zhí)行并發(fā)修改驗(yàn)證。
  • 使用LinkedList時(shí),for-each比f(wàn)or循環(huán)快得多,因?yàn)長(zhǎng)inkedList是通過(guò)使用雙向鏈表實(shí)現(xiàn)的。每個(gè)尋址都需要從頭節(jié)點(diǎn)開始。如果我們需要遍歷LinkedList,我們需要避免使用for循環(huán)。
  • 使用迭代器模式,for-each不需要關(guān)心集合的具體實(shí)現(xiàn)。如果需要替換集合,無(wú)需修改代碼即可輕松替換。

到此這篇關(guān)于淺談Java循環(huán)中的For和For-each哪個(gè)更快的文章就介紹到這了,更多相關(guān)Java For和For-each內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 新手初學(xué)Java流程控制

    新手初學(xué)Java流程控制

    這篇文章主要介紹了JAVA流程控制語(yǔ)句的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下,希望可以幫到你
    2021-07-07
  • HarmonyOS實(shí)現(xiàn)Java端類似Nine-Patch氣泡聊天框代碼

    HarmonyOS實(shí)現(xiàn)Java端類似Nine-Patch氣泡聊天框代碼

    在HarmonyOS Java端實(shí)現(xiàn)氣泡聊天框,與Android 上的9圖(Nine-Patch)有相似的實(shí)現(xiàn)方式,在HarmonyOS中,可以使用ShapeElement和ElementContainer來(lái)創(chuàng)建和管理可伸縮的氣泡背景,下面提供一個(gè)簡(jiǎn)單的示例代碼,可以在 HarmonyOS 中實(shí)現(xiàn)類似于Android的Nine-Patch氣泡聊天框效果
    2024-07-07
  • MyBatis?多表聯(lián)合查詢及優(yōu)化方法

    MyBatis?多表聯(lián)合查詢及優(yōu)化方法

    大家都知道Hibernate 是全自動(dòng)的數(shù)據(jù)庫(kù)持久層框架,它可以通過(guò)實(shí)體來(lái)映射數(shù)據(jù)庫(kù),通過(guò)設(shè)置一對(duì)多、多對(duì)一、一對(duì)一、多對(duì)多的關(guān)聯(lián)來(lái)實(shí)現(xiàn)聯(lián)合查詢,接下來(lái)通過(guò)本文給大家介紹MyBatis?多表聯(lián)合查詢及優(yōu)化,需要的朋友可以參考下
    2022-08-08
  • Java 如何實(shí)現(xiàn)解壓縮文件和文件夾

    Java 如何實(shí)現(xiàn)解壓縮文件和文件夾

    這篇文章主要介紹了Java 如何實(shí)現(xiàn)解壓縮文件和文件夾,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • java簡(jiǎn)單解析xls文件的方法示例【讀取和寫入】

    java簡(jiǎn)單解析xls文件的方法示例【讀取和寫入】

    這篇文章主要介紹了java簡(jiǎn)單解析xls文件的方法,結(jié)合實(shí)例形式分析了java針對(duì)xls文件的讀取和寫入相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-06-06
  • Java中java.sql.SQLException異常的正確解決方法(親測(cè)有效!)

    Java中java.sql.SQLException異常的正確解決方法(親測(cè)有效!)

    SQLException是在Java中處理數(shù)據(jù)庫(kù)操作過(guò)程中可能發(fā)生的異常,通常是由于底層數(shù)據(jù)庫(kù)操作錯(cuò)誤或違反了數(shù)據(jù)庫(kù)規(guī)則而引起的,下面這篇文章主要給大家介紹了關(guān)于Java中java.sql.SQLException異常的正確解決方法,需要的朋友可以參考下
    2024-01-01
  • Spring Boot Starter 自動(dòng)裝配原理全解析

    Spring Boot Starter 自動(dòng)裝配原理全解析

    Spring Boot Starter 的核心設(shè)計(jì)理念是 約定優(yōu)于配置,其核心實(shí)現(xiàn)基于 自動(dòng)配置(Auto-Configuration) 和 條件化注冊(cè)(Conditional Registration),這篇文章主要介紹了Spring Boot Starter 自動(dòng)裝配原理全解析,需要的朋友可以參考下
    2025-04-04
  • MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse2016是一款全球使用最為廣泛的企業(yè)級(jí)開發(fā)環(huán)境程序,這篇文章主要介紹了MyEclipse 2016 CI 4新增BootStrap模板的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • Spring?MVC和springboot靜態(tài)資源處理問(wèn)題

    Spring?MVC和springboot靜態(tài)資源處理問(wèn)題

    這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • IDEA打包應(yīng)用程序的教程圖解

    IDEA打包應(yīng)用程序的教程圖解

    這篇文章主要介紹了IDEA打包應(yīng)用程序的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

永康市| 宁明县| 岳阳市| 集贤县| 邹平县| 将乐县| 沈丘县| 福州市| 枣强县| 青浦区| 奇台县| 江油市| 普兰店市| 尚义县| 金川县| 长宁区| 河西区| 普定县| 仪征市| 梁山县| 米脂县| 南汇区| 双鸭山市| 屏南县| 龙山县| 新源县| 策勒县| 东乌珠穆沁旗| 临澧县| 宿松县| 海安县| 永嘉县| 乾安县| 凤阳县| 临邑县| 得荣县| 滁州市| 中西区| 恭城| 辽宁省| 治多县|