Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中HashMap的克隆实用程序_Java - Fatal编程技术网

java中HashMap的克隆实用程序

java中HashMap的克隆实用程序,java,Java,是否有java实用程序为HashMap执行clone()方法,以便它不仅复制map对象(作为HashMap类中的clone())还复制map元素?元素中引用的其他对象如何?你希望你的克隆有多深 如果您的映射元素没有任何深度引用和/或所有内容都是可序列化的,则可以通过ObjectOutputStream将映射序列化为ByteArrayOutputStream,然后立即反序列化 唯一的替代方法是手动操作。一旦您知道您的键/值对元素是可克隆的: HashMap<Foo, Bar> map1

是否有java实用程序为
HashMap
执行
clone()
方法,以便它不仅复制map对象(作为
HashMap
类中的
clone()
)还复制map元素?

元素中引用的其他对象如何?你希望你的克隆有多深

如果您的映射元素没有任何深度引用和/或所有内容都是可序列化的,则可以通过
ObjectOutputStream
将映射序列化为
ByteArrayOutputStream
,然后立即反序列化


唯一的替代方法是手动操作。

一旦您知道您的键/值对元素是可克隆的:

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());
HashMap map1=populateHashmap();
HashMap map2=新的HashMap();
Set set1=map1.entrySet();
对于(条目e:l)
map2.put(e.getKey().clone(),e.getValue().clone());

查看位于的deepClone方法。它不是泛型的,但它包含几个内置类型(递归地包括HashMap本身),并且显然可以扩展。

深度克隆实用程序建议的SO问题与此类似,并且已经扩展


总之,他们建议使用谷歌代码。根据个人经验,它深度复制了
HashMap
s。它甚至可以克隆不可克隆的东西

通常,复制应该是深入的。下面是一个如何“深度复制”的示例

Map
代码:

public静态映射deepCopyMapIntList
(地图原件){
Map copy=newhashmap(original.size());
for(int i:original.keySet()){
ArrayList list=original.get(i);
copy.put(i,(ArrayList)list.clone());
}
返回副本;
}

@Oso:如果e.getKey()或e.getValue()是另一个HashMap()或其他也需要深度复制克隆的对象,会发生什么情况呢。。。这是一个简单的hashmap克隆例程。我实际上假设这些对象是可克隆的,所以deepnes将由key/value对象本身来解决。为了在不假设可序列化/可克隆的情况下深度克隆hashmap,我认为反射是一种方法(仍然不确定是否为真)。附带说明:如果元素在对象图中是不可变的,则不需要克隆它们。
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;
}