运行复制方法后是否仍会出现锯齿?

时间:2017-08-23 21:22:54

标签: java deep-copy

我有一张地图,其中地图为值,地图为设置为值(在java中)。我为每个人编写了一个方法来复制它们,并尽量避免别名,但按照我的程序的行为方式,我不确定它们是否正常工作。

private Map<String, Set<String>> deepCopySet(Map<String, Set<String>> ruledOutCount) {
    Map<String,Set<String>> copy = new HashMap<String,Set<String>>();
    for(Map.Entry<String, Set<String>> entry : ruledOutCount.entrySet())
    {
        copy.put(entry.getKey(), new HashSet<String>(entry.getValue()));
    }
    return copy;
}

private Map<SG, Map<classObj, Integer>> deepCopyMap(Map<SG, Map<classObj, Integer>> classCountPerSG) 
{
    Map<SG,Map<classObj,Integer>> copy = new HashMap<SG,Map<classObj,Integer>>();
    for(Map.Entry<SG, Map<classObj,Integer>> entry : classCountPerSG.entrySet())
    {
        copy.put(entry.getKey(), new HashMap<classObj,Integer>(entry.getValue()));
    }
    return copy;
}

classObj和SG是我自己的对象。 运行这些复制方法后,是否存在任何别名? 感谢。

1 个答案:

答案 0 :(得分:0)

deepCopySet方法看起来很好。

deepCopyMap方法也很好,但它取决于SGclassObj的类型:如果它们也可能是地图(或其他复杂对象),那么可能会得到一份浅薄的副本。

请注意,Java仅在编译时进行类型检查!所以在下面的代码中

StringBuilder willNotBeCopied = new StringBuilder();
Map evil = new HashMap();
evil.put("a", new HashSet(Arrays.asList(willNotBeCopied)));
Map shallowCopy = deepCopySet(evil);
willNotBeCopied.append("some text");

shallowCopy地图将包含相同的 StringBuilder实例(浅层副本)。