Map的深拷贝问题(putAll,“=”)

38 阅读2分钟

1、场景和问题:

  1. 因为放假的时候接了个电话,领导让我临时解决一个问题,后来这个模块的所有问题都到了我的手中 加班到一点被一个Map的赋值问题难住了 ,
  2. 问题是这样的,我需要对一个map进行解析,但是这个map其他地方需要用到原始的map,原始的map称为Amap,要解析修改的map称为Bmap,在我修改Bmap时,Amap的值也会一起被改变 而且网上搜索 Map赋值等问题大部分都是错误的回答,或者说不适用于深拷贝的场景。

先挂一下大佬的链接blog.csdn.net/qq_39390545…

2、几种方法

  1. new一个新的HashMap然后。 newHashMap = Amap; 果不其然的失败了 这种方法是赋值的引用地址。 所以两个map实际上指向的还是同一个地址(在我的场景里失败了)
  2. 第二种是map的putAll方法。 后来发现putAll后。map中的引用对象还是put的地址(在我的场景里也失败了)
  3. 第三个是大佬的方法,直接上代码。 (这个方法成功了)
package com.softsec.demo;

import java.io.*;
import java.util.*;

public class demoMap implements Cloneable{

    public static void main(String[] srag) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(100);
        list.add(200);

        HashMap<String,Object> old_map = new HashMap<String,Object>();
        old_map.put("name", "蔡虚坤");//放基本类型数据
        old_map.put("list", list);//放对象

        HashMap<String,Object> new_map = new HashMap<String,Object>();

        new_map.putAll(old_map);
        System.out.println("----基础数据展示-----");
        System.out.println("old:" + old_map);
        System.out.println("new:" + new_map);
        System.out.println("----更改基本数据类型的数据-----");
        old_map.put("name", "娘炮");
        System.out.println("old:" + old_map);
        System.out.println("new:" + new_map);
        System.out.println("----更改引用类型的数据-----");
        list.add(300);
        System.out.println("old:" + old_map);
        System.out.println("new:" + new_map);
        System.out.println("----使用序列化进行深拷贝 自定义Clone方法-----");
        new_map = myClone(old_map);
        list.add(400);
        System.out.println("old:" + old_map);
        System.out.println("new:" + new_map);
    }

    /**
     * 自定义clone方法(对象必须是实现了Serializable接口)
     *
     */
    public static <T extends Serializable> T myClone(T obj) {
        T clonedObj = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);
            oos.close();

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            clonedObj = (T) ois.readObject();
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return clonedObj;
    }


}