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

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

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

遍歷集合的刪除元素的問題

問題引出:

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

哪些變量會存在這個問題?

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

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

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

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方法遍歷同樣會出現(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), 不會報錯, 但是刪除數(shù)據(jù)會出現(xiàn)問題, 例如下面代碼中會漏刪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 迭代器刪除方法, 刪除當前所在元素
            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]
}

總結

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

相關文章

  • Java壓縮集合的三種方法

    Java壓縮集合的三種方法

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

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

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

    SpringMVC全局異常處理小結

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

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

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

    java二路歸并排序示例分享

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

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

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

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

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

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

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

    Java8通過CompletableFuture實現(xiàn)異步回調

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

    Java消息隊列Kafka的簡單概述

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

最新評論