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

Java中如何正確遍歷刪除List中的元素

 更新時(shí)間:2023年11月21日 11:21:07   作者:程序員子龍  
刪除List中元素這個(gè)場景很場景,很多人可能直接在循環(huán)中直接去刪除元素,這樣做對嗎?下面小編就來和大家一起討論如何正確遍歷刪除List中的元素,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下

for循環(huán)索引刪除

刪除長度為4的字符串元素。

    List<String> list = new ArrayList<String>();
    list.add("AA");
    list.add("BBB");
    list.add("CCCC");
    list.add("DDDD");
    list.add("EEE");
?
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).length() == 4) {
            list.remove(i);
        }
    }
    System.out.println(list);
}

實(shí)際上輸出結(jié)果:

[AA, BBB, DDDD, EEE]

DDDD 竟然沒有刪掉!

原因是:刪除某個(gè)元素后,list的大小size發(fā)生了變化,而list的索引也在變化,索引為i的元素刪除后,后邊元素的索引自動(dòng)向前補(bǔ)位,即原來索引為i+1的元素,變?yōu)榱怂饕秊?code>i的元素,但是下一次循環(huán)取的索引是i+1,此時(shí)你以為取到的是原來索引為i+1的元素,其實(shí)取到是原來索引為i+2的元素,所以會導(dǎo)致你在遍歷的時(shí)候漏掉某些元素。

比如當(dāng)你刪除第1個(gè)元素后,繼續(xù)根據(jù)索引訪問第2個(gè)元素時(shí),因?yàn)閯h除的關(guān)系后面的元素都往前移動(dòng)了一位,所以實(shí)際訪問的是第3個(gè)元素。不會報(bào)出異常,只會出現(xiàn)漏刪的情況。

foreach循環(huán)刪除元素

for (String s : list) {
        if (s.length() == 4) {
            list.remove(s);
?
        }
    }
    System.out.println(list);

如果沒有break,會報(bào)錯(cuò):

java.util.ConcurrentModificationException at java.util.ArrayListItr.checkForComodification(ArrayList.java:911)atjava.util.ArrayListItr.checkForComodification(ArrayList.java:911) at java.util.ArrayListItr.checkForComodification(ArrayList.java:911)atjava.util.ArrayListItr.next(ArrayList.java:861) at com.demo.ApplicationTest.testDel(ApplicationTest.java:64) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

報(bào)ConcurrentModificationException錯(cuò)誤的原因:

看一下JDK源碼中ArrayList的remove源碼是怎么實(shí)現(xiàn)的:

public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

一般情況下程序會最終調(diào)用fastRemove方法:

private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
    }

在fastRemove方法中,可以看到第2行把modCount變量的值加一,但在ArrayList返回的迭代器會做迭代器內(nèi)部的修改次數(shù)檢查:

final void checkForComodification() {
     if (modCount != expectedModCount)
             throw new ConcurrentModificationException();
     }

而foreach寫法是對實(shí)際的Iterable、hasNext、next方法的簡寫,因?yàn)樯厦娴膔emove(Object)方法修改了modCount的值,所以才會報(bào)出并發(fā)修改異常。

阿里開發(fā)手冊也明確說明禁止使用foreach刪除、增加List元素。

迭代器Iterator刪除元素

    Iterator<String> iterator = list.iterator();
    while(iterator.hasNext()){
        if(iterator.next().length()==4){
            iterator.remove();
        }
    }
    System.out.println(list);

[AA, BBB, EEE]

這種方式可以正常的循環(huán)及刪除。但要注意的是,使用iterator的remove方法,而不是List的remove方法,如果用list的remove方法同樣會報(bào)上面提到的ConcurrentModificationException錯(cuò)誤。

總結(jié)

無論什么場景,都不要對List使用for循環(huán)的同時(shí),刪除List集合元素,要使用迭代器刪除元素。

到此這篇關(guān)于Java中如何正確遍歷刪除List中的元素的文章就介紹到這了,更多相關(guān)Java遍歷刪除List內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java實(shí)現(xiàn)對文件進(jìn)行MD5加密

    基于Java實(shí)現(xiàn)對文件進(jìn)行MD5加密

    MD5(Message-Digest?Algorithm?5)是一種廣泛使用的哈希函數(shù),可以生成一個(gè)128位(16字節(jié))的哈希值,本文將介紹如何使用Java語言實(shí)現(xiàn)對文件的MD5加密,幫助開發(fā)者理解和應(yīng)用這一技術(shù)
    2025-06-06
  • JAVA多線程和并發(fā)基礎(chǔ)面試問答(翻譯)

    JAVA多線程和并發(fā)基礎(chǔ)面試問答(翻譯)

    多線程和并發(fā)問題是Java技術(shù)面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應(yīng)該牢固的掌握J(rèn)ava多線程基礎(chǔ)知識來對應(yīng)日后碰到的問題
    2014-09-09
  • 解決SpringBoot配置文件項(xiàng)目重啟出現(xiàn)亂碼的問題

    解決SpringBoot配置文件項(xiàng)目重啟出現(xiàn)亂碼的問題

    最近在創(chuàng)建了SpringBoot項(xiàng)目后往配置文件中寫了相關(guān)的系統(tǒng)配置,并且在上面加了中文注釋,但是在重啟項(xiàng)目或開機(jī)重啟后遇到了注釋亂碼的情況,下面這篇文章主要給大家介紹一下如何解決SpringBoot配置文件項(xiàng)目重啟出現(xiàn)亂碼的問題,需要的朋友可以參考下
    2023-06-06
  • Springboot通過url訪問本地圖片代碼實(shí)例

    Springboot通過url訪問本地圖片代碼實(shí)例

    這篇文章主要介紹了springboot通過url訪問本地圖片代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 詳解MyBatis日志如何做到兼容所有常用的日志框架

    詳解MyBatis日志如何做到兼容所有常用的日志框架

    這篇文章主要介紹了詳解MyBatis日志如何做到兼容所有常用的日志框架,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SkyWalking自定義鏈路追蹤實(shí)現(xiàn)步驟

    SkyWalking自定義鏈路追蹤實(shí)現(xiàn)步驟

    本文詳細(xì)介紹了如何使用SkyWalking進(jìn)行自定義鏈路追蹤的步驟,包括POM文件依賴和邏輯業(yè)務(wù)代碼的編寫,文章最后推薦了腳本之家作為進(jìn)一步學(xué)習(xí)的資源
    2024-02-02
  • MyBatis-Plus批量操作SQL日志不打印問題的解決方案

    MyBatis-Plus批量操作SQL日志不打印問題的解決方案

    在使用 MyBatis-Plus 的?saveBatch()?和?updateBatchById()?方法進(jìn)行批量數(shù)據(jù)操作時(shí),發(fā)現(xiàn)自定義的 Druid SQL 日志攔截器無法打印這些批量操作的 SQL 語句,導(dǎo)致調(diào)試和問題排查困難,本文給大家該問題的詳細(xì)解決方案,需要的朋友可以參考下
    2026-03-03
  • javaweb在線支付功能實(shí)現(xiàn)代碼

    javaweb在線支付功能實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了javaweb在線支付功能的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解

    SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解

    Spring?Cloud?Gateway旨在為微服務(wù)架構(gòu)提供一種簡單有效的、統(tǒng)一的?API?路由管理方式。Spring?Cloud?Gateway?作為?Spring?Cloud?生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于?Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點(diǎn)和限流等
    2022-10-10
  • Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的方法實(shí)例

    Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論

故城县| 肥乡县| 南江县| 宝坻区| 华宁县| 错那县| 永兴县| 郸城县| 剑阁县| 乌苏市| 宁蒗| 娄烦县| 乃东县| 新昌县| 尼勒克县| 东乌珠穆沁旗| 泽普县| 洪泽县| 隆回县| 涞水县| 松江区| 湘潭市| 宜宾县| 白银市| 乌拉特后旗| 宁明县| 平罗县| 卓尼县| 江西省| 梁山县| 诏安县| 古田县| 墨江| 阳谷县| 万安县| 霞浦县| 铅山县| 云安县| 长泰县| 绥棱县| 南雄市|