【发布时间】:2010-11-03 03:48:45
【问题描述】:
有没有为HashMap 执行clone() 方法的java 实用程序,以便它复制地图元素而不仅仅是地图对象(如HashMap 类中的clone())?
【问题讨论】:
-
附注:如果您的元素在对象图中是不可变的 - 您不需要克隆它们。
标签: java
有没有为HashMap 执行clone() 方法的java 实用程序,以便它复制地图元素而不仅仅是地图对象(如HashMap 类中的clone())?
【问题讨论】:
标签: java
通常副本应该很深。这是一个如何“深拷贝”的示例
Map<Integer, ArrayList<Integer>>
代码:
public static Map<Integer, ArrayList<Integer>> deepCopyMapIntList
(Map<Integer, ArrayList<Integer>> original) {
Map<Integer, ArrayList<Integer>> copy = new HashMap<>(original.size());
for (int i : original.keySet()) {
ArrayList<Integer> list = original.get(i);
copy.put(i, (ArrayList<Integer>) list.clone());
}
return copy;
}
【讨论】:
一旦您知道您的键/值对元素是可克隆的:
HashMap<Foo, Bar> map1 = populateHashmap();
HashMap<Foo, Bar> map2 = new HashMap<Foo, Bar>();
Set<Entry<Foo, Bar>> set1 = map1.entrySet();
for (Entry<Foo, Bar> e : l)
map2.put(e.getKey().clone(), e.getValue().clone());
【讨论】:
SO问题深度克隆实用程序推荐和这个类似,有an answer that may be helpful to you。
总而言之,他们建议使用来自 Google Code 的the Cloning library。根据个人经验,它深拷贝HashMaps。它甚至可以克隆不是Cloneable 的东西。
【讨论】:
看看http://www.devdaily.com/java/jwarehouse/netbeans-src/db/libsrc/org/netbeans/lib/ddl/impl/SpecificationFactory.java.shtml 的 deepClone 方法。它不是通用的,但它包含了几种内置类型(包括 HashMap 本身,递归),并且显然可以扩展。
【讨论】:
元素中引用的其他对象呢?你想要你的克隆有多深?
如果您的地图元素没有任何深度引用和/或所有内容都是Serializable,您可以通过ObjectOutputStream 将地图序列化为ByteArrayOutputStream,然后立即对其进行反序列化。
唯一的另一种选择是手动完成。
【讨论】: