我是靠谱客的博主 冷酷冥王星,这篇文章主要介绍关于将HashMap替换原有Map的key保持value不变报错java.util.ConcurrentModificationException的处理方案,现在分享给大家,希望可以做个参考。
前言
由于苦逼的在公司支持上线,在等待es集群分片完成过程,实在闲的无聊,将之前本地Notion记得一些笔记扔上来一些打发下时间吧( ̄. ̄)
需求
有个类似下面的数据为 Map<String, List<Map<String,String>>>,其中key为资源id,value为List<Map<String,String>>,
{
"4757637007194717896": [{
"oracleTableSpaceSize": "30000",
"oracleTableName": "System4",
"oracleTableSpaceSizeGB": "3"
}, {
"oracleTableSpaceSize": "30000",
"oracleTableName": "System1",
"oracleTableSpaceSizeGB": "3"
}, {
"oracleTableSpaceSize": "30000",
"oracleTableName": "System4",
"oracleTableSpaceSizeGB": "3"
}],
"7669745150692329757": [{
"oracleTableSpaceSize": "30000",
"oracleTableName": "BuildTest4",
"oracleTableSpaceSizeGB": "3"
}, {
"oracleTableSpaceSize": "30000",
"oracleTableName": "BuildTest6",
"oracleTableSpaceSizeGB": "3"
}, {
"oracleTableSpaceSize": "30000",
"oracleTableName": "BuildTest7",
"oracleTableSpaceSizeGB": "3"
}]
}
还有个关于资源id和ip的映射
{
"4757637007194717896": "192.168.189.229",
"7669745150692329757": "192.168.180.158",
"4647551750046525616": "192.168.180.158",
"7316775260328274247": "192.168.120.78"
}
现在需要将第一个Map里面的资源id替换为与其映射的ip
错误的处理方法
通过foreach遍历方法处理,由于HashMap是非线程安全的,会报错,
正确的处理方法
通过将HashMap转化为对应的ConcurrentHashMap来处理,来确保避免发生这个问题,因为ConcurrentHashMap是线程安全的
写个方法实现将普通的HashMap转化为线程安全的ConcurrentHashMap
public static ConcurrentHashMap<String,Object> transferMaptoConcurrentHashMap(Map<String, List<Map<String,String>>> map){
ConcurrentHashMap<String,Object> map2=new ConcurrentHashMap<>();
for (String s : map.keySet()) {
map2.put(s, map.get(s));
}
return map2;
}
最终实现替换key的样例代码如下,注意这里替换的时候value值要通过remove(s)的方式替换,否则会导致Map原有的key-value键值对仍然存在
Map<String,String> resIdAndIpMap=new HashMap<>();
resIdAndIpMap.put("4757637007194717896","192.168.189.229");
resIdAndIpMap.put("7669745150692329757","192.168.180.158");
ConcurrentHashMap<String, Object> concurrentHashMap = transferMaptoConcurrentHashMap(oracleTableSpaceMap);
for (String s : concurrentHashMap.keySet()) {
if(resIdAndIpMap.containsKey(s)){
concurrentHashMap.put(resIdAndIpMap.get(s),concurrentHashMap.remove(s));
}
}
logger.info("组装的多个oracle实例ip以及对应的表空间资源数据为"+JSON.toJSONString(concurrentHashMap));
}
执行上面代码,就会成功替换原有的key了,完美解决了
{
"192.168.180.158": [{
"oracleTableSpaceSize": "30000",
"oracleTableName": "BuildTest5",
"oracleTableSpaceSizeGB": "3"
}, {
"oracleTableSpaceSize": "30000",
"oracleTableName": "BuildTest2",
"oracleTableSpaceSizeGB": "3"
}, {
"oracleTableSpaceSize": "30000",
"oracleTableName": "BuildTest9",
"oracleTableSpaceSizeGB": "3"
}],
"192.168.189.229": [{
"oracleTableSpaceSize": "30000",
"oracleTableName": "System1",
"oracleTableSpaceSizeGB": "3"
}, {
"oracleTableSpaceSize": "30000",
"oracleTableName": "System0",
"oracleTableSpaceSizeGB": "3"
}, {
"oracleTableSpaceSize": "30000",
"oracleTableName": "System4",
"oracleTableSpaceSizeGB": "3"
}]
}
结语
该死的es集群分片快点结束吧,我要回去睡觉。。。。。
最后
以上就是冷酷冥王星最近收集整理的关于关于将HashMap替换原有Map的key保持value不变报错java.util.ConcurrentModificationException的处理方案的全部内容,更多相关关于将HashMap替换原有Map内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复