我是靠谱客的博主 冷酷冥王星,这篇文章主要介绍关于将HashMap替换原有Map的key保持value不变报错java.util.ConcurrentModificationException的处理方案,现在分享给大家,希望可以做个参考。
前言
由于苦逼的在公司支持上线,在等待es集群分片完成过程,实在闲的无聊,将之前本地Notion记得一些笔记扔上来一些打发下时间吧( ̄. ̄)
需求
有个类似下面的数据为 Map<String, List<Map<String,String>>>
,其中key为资源id,value为List<Map<String,String>>,
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29{ "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的映射
复制代码
1
2
3
4
5
6
7{ "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
复制代码
1
2
3
4
5
6
7
8public 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键值对仍然存在
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Map<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了,完美解决了
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29{ "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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复