关于Map的复制问题

关于Map的复制问题


前段时间遇上一个需要复制Map的问题。

------------------------------------------以下废话-------------------------------------------
当时 这边有个需求, 让我们传入一个json把它变成Map, 我们自己在tomcat启动的时候会从配置文件读取一个模板Map

传入的Map就叫jsonMap吧, 模板Map就叫templateMap吧, 我们需要用jsonMap去遍历templateMap, 大概就是看看里面有哪些数据可以匹配, 两者结合会生成一个新的Map, 我们最重要的就是这个最终的Map。

本来没啥问题但突然发现这个代码只能运行一遍, 调查了一下发现是因为在遍历的过程中templateMap被修改了(为了效率), 导致在第二次运行这个方法的时候使用的是被修改过的Map, 最终结合出来的Map和想象中的不太一样, 所以就想着在遍历匹配之前对templateMap复制一下, 使用副本去遍历结合就好了, 所以引申出了关于Map复制的问题。

------------------------------------------废话结束–----------------------------------------

本来想用map.clone的, 但是后来发现是想当然了, clone出来的map指向的和原来的map里面的是一个空间, 改了templateMap之后cloneMap也会被修改, 后来就只能自己手动干一个克隆map了。

从网上找了个轮子造了下改了改, 感谢大神
https://blog.csdn.net/a745233700/article/details/82950069
具体代码如下.

@SuppressWarnings("unchecked")
    public static <T extends Serializable> T clone(Map<String, Object> addSub){
        T cloneObj = null;
        ObjectOutPutStream oos = null;
        ObjectInputStrram ois = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(addSub);
            obs.writeObject(obj);
            
            //分配内存,写入原始对象,生成新对象
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ois = new ObjectInputStream(bais);
            //返回生成的新对象
            cloneObj = (T) ois.readObject();
        } catch (Exception e) {
            throw e;
        } finally {
			if (oos !=null){
			 try {
			 	oos.close();
			 } catch (IOexception e) {
			 }
			}
			if (ois != null) {
				try {
					ois.close();
				} catch (IOException e) {
				}
			}
			log.info("clone()终了");
		}
        return cloneObj;
    }

另外关于map的copy方法在查了一些之后发现自己自己还是图样, 我本来的想法是复制出来的Map和原来的Map一模一样, 即对其中一个Map进行增删改另一个Map都会随之变化, 在查了一些资料后发现并非如此。
对其中一个map里面的东西进行改变的话另一个Map的确会随之进行改变, 但增加的时候却并不是。

我想象了一个并不是很形象的例子:
一个多功能遥控器和几个电视, 遥控器就是Map, 电视就是里面的对象。
在我们克隆这个map的时候就相当于克隆了这个遥控器, 假设原来是遥控器A, 我们克隆了遥控器B, 遥控器A和B并不是一个遥控器, 所以当我们判定的时候A和B并不是一个地址;但是他们指向的电视是同一个电视, 所以我们把A指向的电视改成了智能马桶, B指向的也变成了智能马桶。
但是在此时, 我们在B里面给他多添加了一个功能, 我们让他可以多指向一个智能泡面机, 此时B有了两个功能, 但是A和B不是同一个遥控器, 所以此时A仍然只能指向智能马桶。

灵感来源于
https://blog.csdn.net/wangbiao007/article/details/52625099
感谢大神

为啥突然想到了这个呢, 最近在撸java核心技术的时候发现里面有写, 是很基础的问题, 自己功力还是不够啊, 慢慢来吧

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值