2019独角兽企业重金招聘Python工程师标准>>>

在对HashMap类型进行循环时,有时会出现ConcurrentModificationException。

这个异常的出现是因为在遍历HashMap的同时,在修改HashMap的结构。

例如:

HashMap<String, Double> map = new HashMap<>();
//这样子修改Map并不会有问题
for (int i = 0; i < 10; i++) {map.put(i+"",1d);map.put(i+"1",1d);map.put(i+"2",1d);
}
//这样修改不会出问题
Set<String> keySet = map.keySet();
for (String key :keySet) {map.put(key,2d);
}
//如果改变了Map的结构,比如添加或者删除了,就会报异常
for (String key :keySet) {map.put(key+" newKey",0d);
}

put、remove等操作,如果改变map结构的操作都会导致ConcurrentModificationException。这跟Map的遍历方式有关,map的遍历实际上是动态移动指针进行遍历,在使用到时,才会往后遍历。在指针移动的过程中改变结构可能导致不可预见的结果。

如果想要遍历添加的话,可以这样做:

//先用toArray()"完全遍历"map
Object[] objects = map.keySet().toArray();
for (Object o:objects){String key = (String)o;map.put(key+" is NewKey",3d);
}

先完成遍历,就可以对map的结构进行修改,加入新的元素或者去掉元素。

或者更简明的,直接使用ConcurrentHashMap即可,这个类是HashMap的并发实现,不会因为上述原因抛出异常。

转载于:https://my.oschina.net/pierrecai/blog/886129

Java中的ConcurrentModificationException相关推荐

  1. 如何在Java中处理ConcurrentModificationException? 在循环中从ArrayList中删除元素时要当心...

    从Java中从ArrayList中删除元素时常见的问题之一是ConcurrentModificationException. 如果您对索引使用经典的for循环或增强的for循环,并尝试使用remove ...

  2. 【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  3. Java中的增强for循环的实现原理与坑

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 在JAVA中,遍历集合和数组一般有以下三种形式: for (int i = 0; i < ...

  4. java 中向文本写入和读取hashmap_就靠这一篇HashMap的讲解,我与头条面试官聊了一个小时。...

    预备知识 位运算知识(更多资料私信"学习"免费获取) 位运算操作是由处理器支持的底层操作,底层硬件只支持01这样的数字,因此位运算运行速度很快.尽管现代计算机处理器拥有了更长的指令 ...

  5. JAVA中循环删除list中元素的方法总结

    原文:http://www.cnblogs.com/aspirant/p/7900854.html 印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天 ...

  6. 深入理解java中的ArrayList和LinkedList

    杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...

  7. java中的易混问题收集

    第一,final, finally, finalize的区别. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 a ...

  8. java迭代器的原理_小学生之Java中迭代器实现的原理

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator(); w ...

  9. java transient_【转】Java中的关键字 transient

    阅读目录 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的 ...

  10. 在java中重写方法应遵循规则的包括_Java面试题集合篇二

    Java面试题之Java集合篇二1.遍历一个List有哪些不同的方式? List<String> strList = new ArrayList<>(); //使用for-ea ...

最新文章

  1. codeforce 570 problem E 51Nod-1503-猪和回文
  2. 一天一种设计模式(一)------观察者模式
  3. 数学图形(1.46)高次方程曲线
  4. mark css知识点
  5. WordPress时间日期函数常用代码
  6. rpm命令,yum命令,源码安装python
  7. python代码直接关机_python实现电脑自动关机
  8. Fission:基于 Kubernetes 的 Serverless 函数框架
  9. 计算机网络期末4小时速成
  10. win7修复计算机有密码,win7系统恢复选项密码
  11. (第九章)UI--PS 基础 通道抠图
  12. WiFi偏门协议(四):增强的传输机制802.11aa
  13. 【cocos源码学习】cocos2d-x-4.0 Android Demo工程结构的简析
  14. python并行编程 - 介绍篇
  15. pox.xml有些包下载不了的原因
  16. 二分思想(二分查找,整数二分,浮点数二分)
  17. [Ec Final 2018] Misunderstood … Missing
  18. 多光谱(RGB-T)语义分割2019-RTFNet总结
  19. 制作canal-adapter的docker镜像
  20. 苹果发布新教育计划Apple School Manager

热门文章

  1. 二十一天学通C语言:函数型指针
  2. 1.3 jieba分词运用:词云、关键词抽取、TextRank、TF-IDF
  3. 深入浅出BP神经网络(反向传播算法)
  4. Ros学习笔记(二)创建功能包
  5. java增强型for报错_Java自学-数组 增强型for循环
  6. Django2.0 path 正则匹配不出url的解决方法
  7. Flutter进阶第11篇: 调用原生硬件Api实现扫码 扫描条形码 扫描二维码
  8. rk3399_android7.1音频通路相关说明
  9. 软工大二下半年第十四周学习进度
  10. C# 取Visio模型信息的简易方法