我有一张地图,其中地图为值,地图为设置为值(在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是我自己的对象。 运行这些复制方法后,是否存在任何别名? 感谢。
答案 0 :(得分:0)
deepCopySet
方法看起来很好。
deepCopyMap
方法也很好,但它取决于SG
和classObj
的类型:如果它们也可能是地图(或其他复杂对象),那么可能会得到一份浅薄的副本。
请注意,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实例(浅层副本)。