Map遍历时报ConcurrentModificationException解决方法

简介: Map遍历时报ConcurrentModificationException解决方法

昨天遇到一个问题,就是在遍历Map的时候,报了一个异常:

java.util.ConcurrentModificationException
  at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
  at java.util.HashMap$EntryIterator.next(HashMap.java:1471)
  at java.util.HashMap$EntryIterator.next(HashMap.java:1469)

发现原因如下:

Iterator做遍历的时候,HashMap被修改时会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。

给出的解决方案如下:

1) 通过Iterator修改Hashtable

while(it.hasNext()) {

       Object ele = it.next();

       it.remove();

}

2) 根据实际程序,您自己手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。

3) 使用“ConcurrentHashMap”替换HashMap

ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。

import java.util.concurrent.*;

我采用的是第三种,代码如下:

Map<String, String> map = new ConcurrentHashMap<String, String>();      
map.putAll(param);
for (Map.Entry<String, String> entry : map.entrySet()) {
  String key = entry.getKey();
  map.remove(key);
}

其中param就是调用类传入的map,把它转成 ConcurrentHashMap,然后再进行循环操作。

 

相关文章
|
2月前
使用List中的remove方法遇到数组越界
使用List中的remove方法遇到数组越界
17 2
|
10月前
|
Java
ArrayList 循环遍历并删除元素的常见陷阱
ArrayList 循环遍历并删除元素的常见陷阱
63 0
|
11月前
for-each或迭代器中调用List的remove方法会抛出ConcurrentModificationException的原因
for-each循环遍历的实质是迭代器,使用迭代器的remove方法前必须调用一下next()方法,并且调用一次next()方法后是不允许多次调用remove方法的,为什么呢?接下来一起来看吧
55 0
|
11月前
迭代器遍历元素并给集合中添加元素时报ConcurrentModificationException
迭代器遍历元素并给集合中添加元素时报ConcurrentModificationException
63 0
|
JavaScript 小程序 Java
HashMap 为什么不能一边遍历一遍删除
HashMap 为什么不能一边遍历一遍删除
如何避免数组下标越界
数组下标越界真的是开发过程中的痛,除了在开发过程中各种判断是否设置,是否为空,还有其他优雅的办法解决吗?
114 0
|
Java 索引
Java foreach中List移除元素抛出ConcurrentModificationException原因全解析
Java foreach中List移除元素抛出ConcurrentModificationException原因全解析
316 0
Java foreach中List移除元素抛出ConcurrentModificationException原因全解析
简单说明:ArrayList 在 For 循环中进行删除而产生异常的原因
经常会有人这么对 list 进行遍历,错而不自知。 示例代码如下: public static void main(String[] args) { List<String> list = new ArrayList<>(); list.
7030 0
|
Java
List抛出ConcurrentModificationException
版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82796593 ...
1305 0
|
Java 存储
Java for循环删除ArrayList重复元素陷阱,Iterator迭代器遍历删除重复元素
Java for循环删除ArrayList重复元素陷阱,Iterator迭代器遍历删除重复元素 这是一个一不留神就犯下错误的Java列表ArrayList重复删除元素陷阱,并且问题比较隐蔽。
2067 0