1、场景和问题:
- 因为放假的时候接了个电话,领导让我临时解决一个问题,后来这个模块的所有问题都到了我的手中 加班到一点被一个Map的赋值问题难住了 ,
- 问题是这样的,我需要对一个map进行解析,但是这个map其他地方需要用到原始的map,原始的map称为Amap,要解析修改的map称为Bmap,在我修改Bmap时,Amap的值也会一起被改变 而且网上搜索 Map赋值等问题大部分都是错误的回答,或者说不适用于深拷贝的场景。
先挂一下大佬的链接: blog.csdn.net/qq_39390545…
2、几种方法
- new一个新的HashMap然后。 newHashMap = Amap; 果不其然的失败了 这种方法是赋值的引用地址。 所以两个map实际上指向的还是同一个地址(在我的场景里失败了)
- 第二种是map的putAll方法。 后来发现putAll后。map中的引用对象还是put的地址(在我的场景里也失败了)
- 第三个是大佬的方法,直接上代码。 (这个方法成功了)
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;
}
}