解决ConcurrentModificationException异常问题

 时间:2024-10-11 22:41:56

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 stat足毂忍珩ic 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栏上的最近使用程序怎么关闭?
  • 热门搜索
    庆国庆迎中秋手抄报 防震减灾手抄报版面 我爱文学手抄报图片 安全出行手抄报内容 长征手抄报图片 手抄报边框设计 手抄报花边又漂亮 安全用电手抄报 节约用水手抄报大全 手抄报的版面设计