Java HashMap-深度复制

Java HashMap-深度复制,java,hashmap,deep-copy,Java,Hashmap,Deep Copy,我只是想找出最好的解决方案,如何制作HashMap的深度副本。此映射中没有实现可克隆的对象。我想找到比序列化和反序列化更好的解决方案。我认为它不能以通用的方式实现 如果你有机会简单地实现克隆,我会这么做 更复杂的一点是创建一个类型映射,在这里可以根据每个对象的类查找某种克隆实现类 当对象可能形成一个有向无环图时,我通常会保留一张从我见过的每个对象的原始到克隆的地图,并检查我是否已经绘制了它 当你有一个普通的图表时,问题会变得非常严重。您可能对对象创建顺序有奇怪的约束,甚至在您有最终字段时可能不

我只是想找出最好的解决方案,如何制作
HashMap
的深度副本。此映射中没有实现可克隆的对象。我想找到比序列化和反序列化更好的解决方案。

我认为它不能以通用的方式实现

  • 如果你有机会简单地实现克隆,我会这么做
  • 更复杂的一点是创建一个类型映射,在这里可以根据每个对象的类查找某种克隆实现类
  • 当对象可能形成一个有向无环图时,我通常会保留一张从我见过的每个对象的原始到克隆的地图,并检查我是否已经绘制了它
  • 当你有一个普通的图表时,问题会变得非常严重。您可能对对象创建顺序有奇怪的约束,甚至在您有最终字段时可能不可能
现在,我建议用一种不太笼统的方式重新编写你的问题

看看深度克隆,在谷歌代码上你可以找到一个库。你可以继续读下去

它的工作原理很简单。这可以克隆任何对象,并且对象不必实现任何接口,如serializable

Cloner cloner = new Cloner();
MyClass clone = cloner.deepClone(o);
// clone is a deep-clone of o
但是要注意:这可能会克隆数千个对象(如果克隆的对象有那么多引用)。此外,复制文件或流可能会使JVM崩溃


但是,您可以忽略类的某些实例,如streams等。值得检查此库及其源代码。

这并不容易,我们正在使用某种解决方法:

1) 将映射转换为json字符串。(例如,使用Google Gson)

2) 将json字符串转换回映射


请注意,存在性能问题,但这是一种最简单的方法。

所以这更像是一个如何克隆不可克隆对象的问题?HashMap似乎是一个小细节,可以通过简单的递归来解决。它们是谁的对象类?如果是自己的,只需添加可克隆。尝试克隆不可克隆的对象是一种明确的代码味道。这将是一个考虑重构的好时机。@ SMOLDA-如果你不知道对象是什么,那么这个气味:你不能保证你能够克隆:对象持有的是什么“代码>瞬态<代码>属性,或者是<代码>流<代码>,等等…有些东西是专门设计的,所以你不能得到超过一个。不能复制任意对象。找到另一种方法。它会深度复制一个对象及其所有嵌套成员吗?假设Object1有Object2,Object2有一个映射。当我执行
cloner.deepClone(Object1)时,它会深度复制所有内容吗?@zengr是的,它会复制所有内容。