养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

解决ConcurrentModificationException异常问题

时间:2024-10-25 07:31:54

在遍历Map时删除指定元素,会抛java.util.ConcurrentModificationException使用Iterator的Remove方法可解决此问题

工具/原料

IntelliJ

java

方法/步骤

1、会报java.util.ConcurrentModificationException的代码privatestaticvoidfastFailSceneWhenRemove(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方法,可以解决此问题。可以正常运行的代码:privatest瞢铍库祢at足毂忍珩icvoidcommonSceneWhenRemove(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;importjava.util.HashMap;importjava.util.Iterator;import枣娣空郅java.util.Map;/***CreatedbyMyWorldon2016/3/3.*/publicclassFastFailResolver{publicstaticvoidmain(String[]args){Map<String,String>source=newHashMap<String,String>();for(inti=0;i<10;i++){source.put("key"+i,"value"+i);}System.out.println("Source:"+source);//fastFailSceneWhenRemove(source);commonSceneWhenRemove(source);}privatestaticvoidcommonSceneWhenRemove(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);}privatestaticvoidfastFailSceneWhenRemove(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);}}

© 一点知识