关于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核心技术的时候发现里面有写, 是很基础的问题, 自己功力还是不够啊, 慢慢来吧