我是靠谱客的博主 冷酷冥王星,最近开发中收集的这篇文章主要介绍关于将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的key保持value不变报错java.util.ConcurrentModificationException的处理方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部