搜尋
首頁Javajava教程Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    一、Iterator與foreach的區別

    • 多態差異(foreach底層就是Iterator)

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    ##Iterator是一個介面類型,他不關心集合或陣列的類型;

    #for和foreach都需要先知道集合的類型,甚至是集合內元素的類型;

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?1.為啥說foreach底層就是Iterator

    所寫的程式碼:

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    反編譯程式碼:

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?二、foreach與iterator時remove的差別

    先來看

    阿里java開發手冊

    但1的時候不會報錯,2的時候就會報錯(java.util.ConcurrentModificationException)




    首先來看看ArrayList中iterator方法的實作:

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?呼叫了new Itr(),產生Itr類別(迭代器)。此時會給Itr的三個參數初始化。


    cursor代表下一次的索引位置(開始是0)

    size是集合的大小(2)

    拋出異常類別

    next方法()的時候會檢查checkForComodification是否相等

    modCount修改計數(每次add和remove都會1)expectedModCount期望的最大計數

    1.remove操作源碼分析

    首先來看一下刪除“2”的情況:

    第一次迴圈:

    因為此時的modCount和expectedModCount都為2(因為add了兩次所以modCount為2),所以第一次迴圈中不會拋出例外,拋出異常都是發生在不是第一次循環的情況。在next方法走完後,foreach迴圈方法體中的remove方法的if條件判斷不滿足,就結束了本次迴圈。

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?第二次循環:

    第二次循環的hasNext和next方法都是能成功走完的,在這之後會進入到foreach循環方法體中的remove方法中,進行刪除元素。而此時的size-1變成為了1。在remove方法中的fastRemove方法中,會對modCount 1,也就變成了3。

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    ######第三次迴圈:#########然後會走入到第三次迴圈中的hasNext方法。依照正常的情況下該方法是會回傳false的,但因為此時的size已經變成了1,而此時的cursor為2(cursor代表下一次的索引位置),所以兩者不等,錯誤地傳回了true,所以會繼續走入到next方法中的checkForComodification方法中,判斷此時的modCount和expectedModCount是否相等。因為此時的modCount已經變成了3,和expectedModCount的值為2不等,所以在此拋出了ConcurrentModificationException異常。 ######再來看一下刪除「1」的時候為什麼不會拋出例外:###### #########第一次循環:######### #同上,此時的modCount和expectedModCount都為2,所以第一次迴圈中的hasNext和next方法都不會拋異常。在這之後會進入foreach迴圈方法體中的remove方法中,進行刪除元素。同上,size-1變成為了1,而modCount 1變成為了3。 #########第二次循環:#########在第二個循環的hasNext方法中,此時的cursor為1,而size也是1,兩者相等。所以hasNext方法回傳false,就跳出了foreach循環,不會走到隨後的next方法中,也就不會拋出異常。 ######2.源碼步驟#########第一次#########第①句呼叫iterator(),##################################################################################################### ####呼叫了new Itr(),產生Itr類別(迭代器)。此時會給Itr的三個參數初始化。 ############

    此時expectedModCount == modCount == 2(因為list調動了add方法,add方法會對modCount實作操作)
    第②句呼叫下面hasNext()方法,傳回下一個要存取元素的下標cursor,因為是第一次循環,所以cursor為0,size為2 (0 != 2 true)
    第③句呼叫next()方法,foreach循環方法體中的remove方法的if條件判斷不滿足,就結束了本次循環

    第二次

    第②句呼叫下面hasNext()方法,傳回下一個要存取元素的下標cursor,第二次循環,所以cursor為1,
    size還是為2 (1 != 2 true)
    第③句呼叫next()方法,正常取值,取到第一個元素"2";
    第④句呼叫remove()方法,成功為list刪除元素。注意,在呼叫remove方法的時候,有modCount 。所有此時,modCount3,expectedModCount2,size1

    第三次

    第②句呼叫下面hasNext()方法,傳回下一個要存取元素的下標cursor ,第二次循環,所以cursor為2,size為1
    第③句呼叫next()方法,注意,在next()方法中第一句話就是呼叫checkForComodification();由於modCount(3) ! = expectedModCount(2),所以就拋了異常。

    3.為啥都是底層都是iterator,為啥foreach會報錯

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    當迴圈結束的時候,while (iterator.hasNext() ) 會檢查是否有下個元素存在,在remove刪除2完成後,下次進入cursor還是1,size也是1.
    foreach的話,刪除remove2之後,下次進入cursor是2,size是1,所以返回false,要走next方法,然後,進行檢查,modCount=3,而expectedModCount=2

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    ##三、查看原始碼方法

    如果查看iterator下的ArrayList

    Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?

    以上是Java ArrayList遍歷時使用foreach和iterator刪除元素的差異是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    說明JVM如何充當Java代碼和基礎操作系統之間的中介。說明JVM如何充當Java代碼和基礎操作系統之間的中介。Apr 29, 2025 am 12:23 AM

    JVM的工作原理是將Java代碼轉換為機器碼並管理資源。 1)類加載:加載.class文件到內存。 2)運行時數據區:管理內存區域。 3)執行引擎:解釋或編譯執行字節碼。 4)本地方法接口:通過JNI與操作系統交互。

    解釋Java虛擬機(JVM)在Java平台獨立性中的作用。解釋Java虛擬機(JVM)在Java平台獨立性中的作用。Apr 29, 2025 am 12:21 AM

    JVM使Java實現跨平台運行。 1)JVM加載、驗證和執行字節碼。 2)JVM的工作包括類加載、字節碼驗證、解釋執行和內存管理。 3)JVM支持高級功能如動態類加載和反射。

    您將採取哪些步驟來確保Java應用程序在不同的操作系統上正確運行?您將採取哪些步驟來確保Java應用程序在不同的操作系統上正確運行?Apr 29, 2025 am 12:11 AM

    Java應用可通過以下步驟在不同操作系統上運行:1)使用File或Paths類處理文件路徑;2)通過System.getenv()設置和獲取環境變量;3)利用Maven或Gradle管理依賴並測試。 Java的跨平台能力依賴於JVM的抽象層,但仍需手動處理某些操作系統特定的功能。

    Java是否需要特定於平台的配置或調整區域?Java是否需要特定於平台的配置或調整區域?Apr 29, 2025 am 12:11 AM

    Java在不同平台上需要進行特定配置和調優。 1)調整JVM參數,如-Xms和-Xmx設置堆大小。 2)選擇合適的垃圾回收策略,如ParallelGC或G1GC。 3)配置Native庫以適應不同平台,這些措施能讓Java應用在各種環境中發揮最佳性能。

    哪些工具或庫可以幫助您解決Java開發中特定於平台的挑戰?哪些工具或庫可以幫助您解決Java開發中特定於平台的挑戰?Apr 29, 2025 am 12:01 AM

    Osgi,Apachecommonslang,JNA和JvMoptionsareeForhandlingForhandlingPlatform-specificchallengesinjava.1)osgimanagesdeppedendendencenciesandisolatescomponents.2)apachecommonslangprovidesitorityfunctions.3)

    JVM如何在不同平台上管理垃圾收集?JVM如何在不同平台上管理垃圾收集?Apr 28, 2025 am 12:23 AM

    JVMmanagesgarbagecollectionacrossplatformseffectivelybyusingagenerationalapproachandadaptingtoOSandhardwaredifferences.ItemploysvariouscollectorslikeSerial,Parallel,CMS,andG1,eachsuitedfordifferentscenarios.Performancecanbetunedwithflagslike-XX:NewRa

    為什麼Java代碼可以在不同的操作系統上運行,而無需修改?為什麼Java代碼可以在不同的操作系統上運行,而無需修改?Apr 28, 2025 am 12:14 AM

    Java代碼可以在不同操作系統上無需修改即可運行,這是因為Java的“一次編寫,到處運行”哲學,由Java虛擬機(JVM)實現。 JVM作為編譯後的Java字節碼與操作系統之間的中介,將字節碼翻譯成特定機器指令,確保程序在任何安裝了JVM的平台上都能獨立運行。

    描述編譯和執行Java程序的過程,突出平台獨立性。描述編譯和執行Java程序的過程,突出平台獨立性。Apr 28, 2025 am 12:08 AM

    Java程序的編譯和執行通過字節碼和JVM實現平台獨立性。 1)編寫Java源碼並編譯成字節碼。 2)使用JVM在任何平台上執行字節碼,確保代碼的跨平台運行。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

    SublimeText3 英文版

    SublimeText3 英文版

    推薦:為Win版本,支援程式碼提示!

    SublimeText3 Linux新版

    SublimeText3 Linux新版

    SublimeText3 Linux最新版

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    Atom編輯器mac版下載

    Atom編輯器mac版下載

    最受歡迎的的開源編輯器