【问题标题】:clone utility for HashMap in javajava中HashMap的克隆实用程序
【发布时间】:2010-11-03 03:48:45
【问题描述】:

有没有为HashMap 执行clone() 方法的java 实用程序,以便它复制地图元素而不仅仅是地图对象(如HashMap 类中的clone())?

【问题讨论】:

  • 附注:如果您的元素在对象图中是不可变的 - 您不需要克隆它们。

标签: java


【解决方案1】:

通常副本应该很深。这是一个如何“深拷贝”的示例

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;
}

【讨论】:

    【解决方案2】:

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

    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());
    

    【讨论】:

    • @Oso:如果 e.getKey() 或 e.getValue() 是另一个 HashMap() 或其他也需要深拷贝克隆的对象,会发生什么?
    • 嗯...这是一个简单的 hashmap 克隆例程。我实际上假设对象是可克隆的,因此深度将由键/值对象本身解决。为了在不假设可序列化/可克隆的情况下深度克隆哈希图,我认为反射是一种方法(仍然不确定是否为真)。
    【解决方案3】:

    SO问题深度克隆实用程序推荐和这个类似,有an answer that may be helpful to you

    总而言之,他们建议使用来自 Google Code 的the Cloning library。根据个人经验,它深拷贝HashMaps。它甚至可以克隆不是Cloneable 的东西。

    【讨论】:

      【解决方案4】:

      看看http://www.devdaily.com/java/jwarehouse/netbeans-src/db/libsrc/org/netbeans/lib/ddl/impl/SpecificationFactory.java.shtml 的 deepClone 方法。它不是通用的,但它包含了几种内置类型(包括 HashMap 本身,递归),并且显然可以扩展。

      【讨论】:

        【解决方案5】:

        元素中引用的其他对象呢?你想要你的克隆有多深?

        如果您的地图元素没有任何深度引用和/或所有内容都是Serializable,您可以通过ObjectOutputStream 将地图序列化为ByteArrayOutputStream,然后立即对其进行反序列化。

        唯一的另一种选择是手动完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-14
          • 1970-01-01
          • 2020-04-09
          • 2010-10-14
          • 2016-06-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多