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

Java中遍歷集合的并發(fā)修改異常解決方案實(shí)例代碼

 更新時(shí)間:2022年12月13日 15:35:53   作者:藍(lán)桉cyq  
當(dāng)你遍歷集合的同時(shí),又往集合中添加或者刪除元素,就可能報(bào)并發(fā)修改異常,下面這篇文章主要給大家介紹了關(guān)于Java中遍歷集合的并發(fā)修改異常解決方案的相關(guān)資料,需要的朋友可以參考下

遍歷集合的刪除元素的問(wèn)題

問(wèn)題引出:

當(dāng)我們遍歷集合從中找出某一批元素并刪除的時(shí)候, 可能出現(xiàn)一種并發(fā)修改異常問(wèn)題。

哪些變量會(huì)存在這個(gè)問(wèn)題?

迭代器遍歷集合且直接用集合刪除元素的時(shí)候可能出現(xiàn), 例如下面代碼就會(huì)報(bào)錯(cuò)。

public static void main(String[] args) {
    Collection<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    list.add("aaa");
    list.add("ddd");
    list.add("aaa");

    // 刪除全部aaa元素
    Iterator<String> ite =  list.iterator();
    while (ite.hasNext()) {
        String item = ite.next();
        if ("aaa".equals(item)) {
            list.remove("aaa");
        }
    }
}

增強(qiáng)for循環(huán)遍歷集合且直接用集合刪除元素的時(shí)候可能出現(xiàn), 例如下面代碼同樣會(huì)報(bào)錯(cuò)。

public static void main(String[] args) {
    Collection<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    list.add("aaa");
    list.add("ddd");
    list.add("aaa");

    for (String item : list) {
        if ("aaa".equals(item)) {
            list.remove("aaa");
        }
    }
}

Lambda方法遍歷同樣會(huì)出現(xiàn)一樣的bug

public static void main(String[] args) {
    Collection<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    list.add("aaa");
    list.add("ddd");
    list.add("aaa");

    list.forEach(s -> {
        if ("aaa".equals(s)) {
            list.remove("aaa");
        }
    });
}

使用for循環(huán), 不會(huì)報(bào)錯(cuò), 但是刪除數(shù)據(jù)會(huì)出現(xiàn)問(wèn)題, 例如下面代碼中會(huì)漏刪aaa

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("aaa");
    list.add("ccc");
    list.add("aaa");
    list.add("ddd");
    list.add("aaa");

    for (int i = 0; i < list.size(); i++) {
        String item = list.get(i);
        if ("aaa".equals(item)) {
            list.remove("aaa");
        }
    }

    System.out.println(list); // [ccc, ddd, aaa]
}

解決方案:

迭代器的解決方法: 迭代器遍歷集合但是用迭代器自己的刪除方法操作可以解決。

public static void main(String[] args) {
    Collection<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    list.add("aaa");
    list.add("ddd");
    list.add("aaa");

    // 刪除全部aaa元素
    Iterator<String> ite =  list.iterator();
    while (ite.hasNext()) {
        String item = ite.next();
        if ("aaa".equals(item)) {
            // shiy 迭代器刪除方法, 刪除當(dāng)前所在元素
            ite.remove();
        }
    }

    System.out.println(list); // [bbb, ccc, ddd]
}

for循環(huán)的解決方法一: 從后往前刪

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("aaa");
    list.add("ccc");
    list.add("aaa");
    list.add("ddd");
    list.add("aaa");

    for (int i = list.size() - 1; i >= 0; i--) {
        String item = list.get(i);
        if ("aaa".equals(item)) {
            list.remove("aaa");
        }
    }

    System.out.println(list); // [ccc, ddd]
}

for循環(huán)的解決方法二: 刪除完元素讓 i 減1, i--

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("aaa");
    list.add("ccc");
    list.add("aaa");
    list.add("ddd");
    list.add("aaa");

    for (int i = 0; i < list.size(); i++) {
        String item = list.get(i);
        if ("aaa".equals(item)) {
            list.remove("aaa");
            // 刪除了元素i--
            i--;
        }
    }

    System.out.println(list); // [ccc, ddd]
}

總結(jié)

到此這篇關(guān)于Java中遍歷集合的并發(fā)修改異常解決的文章就介紹到這了,更多相關(guān)Java遍歷集合并發(fā)修改異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java壓縮集合的三種方法

    Java壓縮集合的三種方法

    這篇文章主要介紹了Java壓縮集合的三種方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • java list中包含某個(gè)字符串的兩種方法實(shí)現(xiàn)

    java list中包含某個(gè)字符串的兩種方法實(shí)現(xiàn)

    在Java開(kāi)發(fā)中,經(jīng)常需要判斷一個(gè)List中是否包含特定的字符串,包括使用contains()方法和循環(huán)遍歷判斷,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • SpringMVC全局異常處理小結(jié)

    SpringMVC全局異常處理小結(jié)

    在開(kāi)發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類型的異常處理從各處理過(guò)程解耦出來(lái),既保證了相關(guān)處理過(guò)程的功能較單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù),本文介紹SpringMVC全局異常處理,感興趣的朋友一起看看吧
    2024-03-03
  • java開(kāi)發(fā)環(huán)境的完整搭建過(guò)程

    java開(kāi)發(fā)環(huán)境的完整搭建過(guò)程

    這篇文章主要給大家介紹了關(guān)于java開(kāi)發(fā)環(huán)境的完整搭建過(guò)程,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • java二路歸并排序示例分享

    java二路歸并排序示例分享

    這篇文章主要介紹了java二路歸并排序示例,需要的朋友可以參考下
    2014-02-02
  • Java如何生成帶網(wǎng)站鏈接(URL)的二維碼

    Java如何生成帶網(wǎng)站鏈接(URL)的二維碼

    自從微信掃描出世,二維碼掃描逐漸已經(jīng)成為一種主流的信息傳遞和交換方式,這篇文章主要給大家介紹了關(guān)于Java如何生成帶網(wǎng)站鏈接(URL)的二維碼的相關(guān)資料,文中通過(guò)圖文實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • JAVA 自定義線程池的最大線程數(shù)設(shè)置方法

    JAVA 自定義線程池的最大線程數(shù)設(shè)置方法

    這篇文章主要介紹了JAVA 自定義線程池的最大線程數(shù)設(shè)置方法,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 使用Java實(shí)現(xiàn)先查詢緩存再查詢數(shù)據(jù)庫(kù)

    使用Java實(shí)現(xiàn)先查詢緩存再查詢數(shù)據(jù)庫(kù)

    這篇文章主要介紹了使用Java實(shí)現(xiàn)先查詢緩存再查詢數(shù)據(jù)庫(kù),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Java8通過(guò)CompletableFuture實(shí)現(xiàn)異步回調(diào)

    Java8通過(guò)CompletableFuture實(shí)現(xiàn)異步回調(diào)

    這篇文章主要介紹了Java8通過(guò)CompletableFuture實(shí)現(xiàn)異步回調(diào),CompletableFuture是Java?8?中新增的一個(gè)類,它是對(duì)Future接口的擴(kuò)展,下文關(guān)于其更多相關(guān)詳細(xì)介紹需要的小伙伴可以參考一下
    2022-04-04
  • Java消息隊(duì)列Kafka的簡(jiǎn)單概述

    Java消息隊(duì)列Kafka的簡(jiǎn)單概述

    這篇文章主要介紹了Java消息隊(duì)列Kafka的簡(jiǎn)單概述,消息系統(tǒng)負(fù)責(zé)將數(shù)據(jù)從一個(gè)應(yīng)用程序傳輸?shù)搅硪粋€(gè)應(yīng)用程序,應(yīng)用程序可以專注于數(shù)據(jù),不擔(dān)心如何共享它,需要的朋友可以參考下
    2023-07-07

最新評(píng)論