我在使用HashMap时抛出了java.util.ConcurrentModificationException [英] I am getting java.util.ConcurrentModificationException thrown while using HashMap
本文介绍了我在使用HashMap时抛出了java.util.ConcurrentModificationException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
与HashMap中的元素相比,如何删除下面代码中的键值对?
How do i remove the key value pair in the code below comparing with elements in HashMap?
Map<BigDecimal, TransactionLogDTO> transactionLogMap = new HashMap<BigDecimal, TransactionLogDTO>();
for (BigDecimal regionID : regionIdList) {// Generation new logDTO
// objects for each in scope
// region
transactionLogMap.put(regionID, new TransactionLogDTO());
}
Set<BigDecimal> inScopeActiveRegionIdSet = new HashSet<BigDecimal>();
for (PersonDTO personDTO4 : activePersons) {
inScopeActiveRegionIdSet.add(personDTO4.getRegion());
}
for (BigDecimal bigDecimal : transactionLogMap.keySet()) {
if (!inScopeActiveRegionIdSet.contains(bigDecimal)) {
transactionLogMap.remove(bigDecimal);
}
}
推荐答案
问题出在这些行中
for (BigDecimal bigDecimal : transactionLogMap.keySet()) {
if(!inScopeActiveRegionIdSet.contains(bigDecimal)) {
transactionLogMap.remove(bigDecimal);
}
}
您正在遍历transactionLogMap
,同时还在调用transactionLogMap.remove
时直接修改了基础Collection
,这是不允许的,因为增强的for循环无法看到这些更改.
You are iterating through the transactionLogMap
whilst also directly modifying the underlying Collection
when you call transactionLogMap.remove
, which is not allowed because the enhanced for loop cannot see those changes.
正确的解决方案是使用Iterator
:
The correct solution is to use the Iterator
:
Iterator<BigDecimal> it = transactionLogMap.keySet().iterator();//changed for syntax correctness
while (it.hasNext()) {
BigDecimal bigDecimal = it.next();
if(!inScopeActiveRegionIdSet.contains(bigDecimal)) {
it.remove();
}
}
这篇关于我在使用HashMap时抛出了java.util.ConcurrentModificationException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文