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

Java?ArrayList遍歷foreach與iterator時(shí)remove的區(qū)別

 更新時(shí)間:2022年07月22日 11:37:00   作者:Knight_AL  
這篇文章主要介紹了Java?ArrayList遍歷foreach與iterator時(shí)remove的區(qū)別,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

一、Iterator和foreach的區(qū)別

  • 多態(tài)差別(foreach底層就是Iterator)
  • Iterator是一個(gè)接口類型,他不關(guān)心集合或者數(shù)組的類型;
  • for和foreach都需要先知道集合的類型,甚至是集合內(nèi)元素的類型;

1.為啥說(shuō)foreach底層就是Iterator

編寫的代碼:

反編譯代碼:

二、foreach與iterator時(shí)remove的區(qū)別

先來(lái)看阿里java開(kāi)發(fā)手冊(cè)
但1的時(shí)候不會(huì)報(bào)錯(cuò),2的時(shí)候就會(huì)報(bào)錯(cuò)(java.util.ConcurrentModificationException)

首先來(lái)看一下ArrayList中iterator方法的實(shí)現(xiàn):

調(diào)用了new Itr(),生成Itr類(迭代器)。此時(shí)會(huì)給Itr的三個(gè)參數(shù)初始化。

  • cursor代表下一次的索引位置(開(kāi)始是0)
  • size是集合的大小(2)

拋出異常類
next方法()的時(shí)候會(huì)檢查checkForComodification是否相等

modCount修改計(jì)數(shù)(每次add和remove都會(huì)+1)expectedModCount期望的最大計(jì)數(shù)

1.remove操作源碼分析

首先來(lái)看一下刪除“2”的情況:
第一次循環(huán):

因?yàn)榇藭r(shí)的modCount和expectedModCount都為2(因?yàn)閍dd了兩次所以modCount為2),所以第一次循環(huán)中不會(huì)拋出異常,拋出異常都是發(fā)生在不是第一次循環(huán)的情況中。在next方法走完后,foreach循環(huán)方法體中的remove方法的if條件判斷不滿足,就結(jié)束了本次循環(huán)。
第二次循環(huán):
第二次循環(huán)的hasNext和next方法都是能成功走完的,在這之后會(huì)進(jìn)入到foreach循環(huán)方法體中的remove方法中,進(jìn)行刪除元素。而此時(shí)的size-1變?yōu)榱?。在remove方法中的fastRemove方法中,會(huì)對(duì)modCount+1,也就變?yōu)榱?。

第三次循環(huán):

然后會(huì)走入到第三次循環(huán)中的hasNext方法中。按照正常的情況下該方法是會(huì)返回false的,但因?yàn)榇藭r(shí)的size已經(jīng)變?yōu)榱?,而此時(shí)的cursor為2(cursor代表下一次的索引位置),所以兩者不等,錯(cuò)誤地返回了true,所以會(huì)繼續(xù)走入到next方法中的checkForComodification方法中,判斷此時(shí)的modCount和expectedModCount是否相等。因?yàn)榇藭r(shí)的modCount已經(jīng)變?yōu)榱?,和expectedModCount的值為2不等,所以在此拋出了ConcurrentModificationException異常。
再來(lái)看一下刪除“1”的時(shí)候?yàn)槭裁床粫?huì)拋出異常:
 

第一次循環(huán):

同上,此時(shí)的modCount和expectedModCount都為2,所以第一次循環(huán)中的hasNext和next方法都不會(huì)拋異常。在這之后會(huì)進(jìn)入到foreach循環(huán)方法體中的remove方法中,進(jìn)行刪除元素。同上,size-1變?yōu)榱?,而modCount+1變?yōu)榱?。

第二次循環(huán):

在第二次循環(huán)的hasNext方法中,此時(shí)的cursor為1,而size也是1,兩者相等。所以hasNext方法返回false,就跳出了foreach循環(huán),不會(huì)走到隨后的next方法中,也就不會(huì)拋出異常。

2.源碼步驟

第一次

第①句調(diào)用iterator(),

調(diào)用了new Itr(),生成Itr類(迭代器)。此時(shí)會(huì)給Itr的三個(gè)參數(shù)初始化。

此時(shí)expectedModCount == modCount == 2(因?yàn)閘ist調(diào)動(dòng)了add方法,add方法會(huì)對(duì)modCount實(shí)現(xiàn)++操作)
第②句調(diào)用下面hasNext()方法,返回下一個(gè)要訪問(wèn)元素的下標(biāo)cursor,因?yàn)槭堑谝淮窝h(huán),所以cursor為0,size為2 (0 != 2 true)
第③句調(diào)用next()方法,foreach循環(huán)方法體中的remove方法的if條件判斷不滿足,就結(jié)束了本次循環(huán)

第二次

第②句調(diào)用下面hasNext()方法,返回下一個(gè)要訪問(wèn)元素的下標(biāo)cursor,第二次循環(huán),所以cursor為1,
size還是為2 (1 != 2 true)
第③句調(diào)用next()方法,正常取值,取到第一個(gè)元素"2";
第④句調(diào)用remove()方法,成功給list刪除元素。注意,在調(diào)用remove方法的時(shí)候,有modCount++。所有此時(shí),modCount3,expectedModCount2,size1

第三次

第②句調(diào)用下面hasNext()方法,返回下一個(gè)要訪問(wèn)元素的下標(biāo)cursor,第二次循環(huán),所以cursor為2,size為1
第③句調(diào)用next()方法,注意,在next()方法中第一句話就是調(diào)用checkForComodification();由于modCount(3) != expectedModCount(2),所以就拋了異常。

3.為啥都是底層都是iterator,為啥foreach會(huì)報(bào)錯(cuò)

當(dāng)循環(huán)結(jié)束的時(shí)候,while (iterator.hasNext()) 會(huì)檢查是否有下個(gè)元素存在,在remove刪除2完成后,下次進(jìn)入cursor還是1,size也是1.
foreach的話,刪除remove2之后,下次進(jìn)入cursor是2,size是1,所以返回false,要走next方法,然后,進(jìn)行檢查,modCount=3,而expectedModCount=2

三、查看源碼方法

如果查看iterator下的ArrayList

remove也是如此

到此這篇關(guān)于Java ArrayList遍歷foreach與iterator時(shí)remove的區(qū)別的文章就介紹到這了,更多相關(guān)Java ArrayList遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot項(xiàng)目配置logback日志系統(tǒng)的實(shí)現(xiàn)

    springboot項(xiàng)目配置logback日志系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了springboot項(xiàng)目配置logback日志系統(tǒng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java實(shí)現(xiàn)簡(jiǎn)易版圖形界面計(jì)算器

    java實(shí)現(xiàn)簡(jiǎn)易版圖形界面計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易版圖形界面計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Java編程實(shí)現(xiàn)向文本文件中讀取數(shù)據(jù)之Scanner用法示例

    Java編程實(shí)現(xiàn)向文本文件中讀取數(shù)據(jù)之Scanner用法示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)向文本文件中讀取數(shù)據(jù)之Scanner用法,結(jié)合實(shí)例形式分析了java使用Scanner類讀取文本文件相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-03-03
  • 數(shù)組重排序(如何將所有奇數(shù)都放在所有偶數(shù)前面)的深入分析

    數(shù)組重排序(如何將所有奇數(shù)都放在所有偶數(shù)前面)的深入分析

    本篇文章是對(duì)數(shù)組重排序(如何將所有奇數(shù)都放在所有偶數(shù)前面)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • SpringWebMVC的常用注解及應(yīng)用分層架構(gòu)詳解

    SpringWebMVC的常用注解及應(yīng)用分層架構(gòu)詳解

    這篇文章主要介紹了SpringWebMVC的常用注解及應(yīng)用分層架構(gòu),SpringWebMVC是基于ServletAPI構(gòu)建的原始Web框架,從?開(kāi)始就包含在Spring框架中,感興趣的朋友可以參考下
    2024-05-05
  • Java 文件上傳的實(shí)例詳解

    Java 文件上傳的實(shí)例詳解

    這篇文章主要介紹了Java 文件上傳的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能掌握這部分內(nèi)容,使用幾種文件上傳的方法,需要的朋友可以參考下
    2017-09-09
  • springboot發(fā)送request請(qǐng)求的方式小結(jié)

    springboot發(fā)送request請(qǐng)求的方式小結(jié)

    在Java中,發(fā)送HTTP請(qǐng)求是常見(jiàn)需求,hutool工具包和RestTemplate類是實(shí)現(xiàn)此功能的兩種主流方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • springboot接入方式對(duì)接股票數(shù)據(jù)源API接口的操作方法

    springboot接入方式對(duì)接股票數(shù)據(jù)源API接口的操作方法

    本文介紹了如何使用Java語(yǔ)言創(chuàng)建一個(gè)項(xiàng)目來(lái)對(duì)接StockTV的API接口,包括使用HttpURLConnection或OkHttp發(fā)送HTTP請(qǐng)求,使用Java-WebSocket庫(kù)處理WebSocket連接等步驟,項(xiàng)目結(jié)構(gòu)包括添加依賴、創(chuàng)建基礎(chǔ)工具類、實(shí)現(xiàn)股票API、外匯API等,感興趣的朋友一起看看吧
    2025-03-03
  • Springboot打包部署項(xiàng)目的過(guò)程詳解

    Springboot打包部署項(xiàng)目的過(guò)程詳解

    這篇文章主要介紹了Springboot打包部署項(xiàng)目的過(guò)程,通過(guò)jar包方式打包和war方式打包,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12

最新評(píng)論

宁乡县| 商城县| 红桥区| 灌云县| 荥经县| 横峰县| 镇宁| 北宁市| 叙永县| 东阳市| 怀化市| 五常市| 涡阳县| 富锦市| 阿拉尔市| 土默特左旗| 专栏| 西宁市| 桐城市| 丰原市| 织金县| 内乡县| 报价| 武鸣县| 英超| 黑河市| 罗平县| 安徽省| 临沧市| 怀集县| 介休市| 长垣县| 开远市| 万年县| 大新县| 手机| 甘南县| 鲁山县| 康平县| 油尖旺区| 扎鲁特旗|