解决ConcurrentModificationException异常问题

 时间:2026-02-13 19:46:41

1、会报java.util.ConcurrentModificationException的代码

private static void fastFailSceneWhenRemove(Map<String, String> source) {    

    for (Map.Entry<String, String> entry : source.entrySet()) {       

         if (entry.getKey().contains("1")) {            

            source.remove(entry.getKey());        

        }    

    }    

    System.out.println(source);

}

解决ConcurrentModificationException异常问题

解决ConcurrentModificationException异常问题

2、使用Iterator的Remove方法,可以解决此问题。

可以正常运行的代码:private static void commonSceneWhenRemove(Map<String, String> source) {    

        Iterator<Map.Entry<String, String>> iterator = source.entrySet().iterator();    

            while (iterator.hasNext()) {        

                Map.Entry<String, String> entry = iterator.next();        

                    if (entry.getKey().contains("1")) {            

                        iterator.remove();        

            }   

         }    

    System.out.println(source);

   }

解决ConcurrentModificationException异常问题

解决ConcurrentModificationException异常问题

3、java.util.HashMap中抛java.util.ConcurrentModificationException的两个场景

可以看到,是否抛异常是由modCount != expectedModCount来决定的

解决ConcurrentModificationException异常问题

4、java.util.HashMap的remove方法的源代码

可以看到:

remove方法执行之后,java.util.HashMap.modCount++,

但java.util.HashMap.HashIterator.expectedModCount的值没有发生变化

解决ConcurrentModificationException异常问题

解决ConcurrentModificationException异常问题

5、java.util.HashMap.HashIterator的remove方法的源代码

可以看出:

remove方法执行之后,modCount和expectedModCount的值是相等的。

因此不会抛java.util.ConcurrentModificationException

解决ConcurrentModificationException异常问题

6、完整的代码:

package chapter1;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

/** * Created by MyWorld on 2016/3/3. */

public class FastFailResolver {    

        public static void main(String[] args) {        

            Map<String, String> source = new HashMap<String, String>();                    for (int i = 0; i < 10; i++) {            

                    source.put("key" + i, "value" + i);        

                }        

            System.out.println("Source:" + source);

        //        fastFailSceneWhenRemove(source);        

            commonSceneWhenRemove(source);    

}   

 private static void commonSceneWhenRemove(Map<String, String> source) {       

         Iterator<Map.Entry<String, String>> iterator = source.entrySet().iterator();        

        while (iterator.hasNext()) {            

            Map.Entry<String, String> entry = iterator.next();           

                 if (entry.getKey().contains("1")) {               

                     iterator.remove();          

                      }      

                  }       

             System.out.println(source);   

     }   

 private static void fastFailSceneWhenRemove(Map<String, String> source) {        

            for (Map.Entry<String, String> entry : source.entrySet()) {           

                 if (entry.getKey().contains("1")) {                

                        source.remove(entry.getKey());            

                }       

             }       

             System.out.println(source);   

         }

    }

  • Zepp软件在哪设置单位
  • plsql如何导出表结构和数据
  • char varchar varchar2 的区别
  • jQuery怎么获取类名
  • Mac dock栏上的最近使用程序怎么关闭?
  • 热门搜索
    增城白水寨旅游攻略 金马旅游官网 山东周边旅游景点大全 河南的旅游景点有哪些 山东省内旅游景点 田横岛旅游度假区 郑州旅游网 伶仃岛旅游攻略 珠海户外旅游网 海南万宁旅游