欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

For-each不是一種新語法,而是Java的語法糖。在編譯時,編譯器將此代碼轉(zhuǎn)換為迭代器實現(xiàn),并將其編譯為字節(jié)碼。我們可以通過執(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命令來獲取integers變量并且調(diào)用List.iterator來獲取迭代器實例和調(diào)用iterator.hasNext。如果返回true,調(diào)用iterator.next方法。

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

基準(zhǔn)測試

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

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

這是測試結(jié)果:

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

我們可以說for循環(huán)比for-each好嗎?

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

原因分析

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

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

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

結(jié)論

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

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

相關(guān)文章

  • 基于@ComponentScan注解及其XML配置方式

    基于@ComponentScan注解及其XML配置方式

    這篇文章主要介紹了基于@ComponentScan注解及其XML配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java sleep()和wait()的區(qū)別點總結(jié)

    java sleep()和wait()的區(qū)別點總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于java sleep()和wait()的區(qū)別的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • java實現(xiàn)簡單猜數(shù)字

    java實現(xiàn)簡單猜數(shù)字

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡單猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 詳解Java的Struts框架以及相關(guān)的MVC設(shè)計理念

    詳解Java的Struts框架以及相關(guān)的MVC設(shè)計理念

    這篇文章主要介紹了詳解Java的Struts框架以及相關(guān)的MVC設(shè)計理念,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • Java Hashtable機(jī)制深入了解

    Java Hashtable機(jī)制深入了解

    HashTable是jdk 1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會在面試中經(jīng)常被問到。本文就來帶大家一起深入了解一下Hashtable,需要的可以參考一下
    2022-09-09
  • Java對xls文件進(jìn)行讀寫操作示例代碼

    Java對xls文件進(jìn)行讀寫操作示例代碼

    Java開發(fā)項目中經(jīng)常會碰到處理Excel文件中數(shù)據(jù)的情況,下面這篇文章主要給大家介紹了利用Java對xls文件進(jìn)行讀寫操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • Python連接Java Socket服務(wù)端的實現(xiàn)方法

    Python連接Java Socket服務(wù)端的實現(xiàn)方法

    這篇文章主要介紹了Python連接Java Socket服務(wù)端的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java使用JNDI連接數(shù)據(jù)庫的實現(xiàn)方法

    Java使用JNDI連接數(shù)據(jù)庫的實現(xiàn)方法

    本文主要介紹了Java使用JNDI連接數(shù)據(jù)庫的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 跟我學(xué)Java Swing之游戲設(shè)計(2)

    跟我學(xué)Java Swing之游戲設(shè)計(2)

    跟我學(xué)Java Swing之游戲設(shè)計(2)...
    2006-12-12
  • Java?web訪問http://localhost:8080/xx/xx.jsp報404錯誤問題的解決方法

    Java?web訪問http://localhost:8080/xx/xx.jsp報404錯誤問題的解決方法

    這篇文章主要給大家介紹了關(guān)于Java?web訪問http://localhost:8080/xx/xx.jsp報404錯誤問題的解決方法,很多小伙伴在剛開始用Springboot整合jsp開發(fā)時都會遇到這個問題, 按照別人的教程一步一步搭建,但就是會報404,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04

最新評論