Gre*_*een 5 java clone copy hashmap
我无法获得HashMaps的单独副本.我的意思是,一旦我制作了原件的副本,对其中一个进行更改并不会改变另一个.
我有两种HashMaps格式:
HashMap<String, List<String> one = new HashMap<String, List<String>();
HashMap<String, List<String> two = new HashMap<String, List<String>();
Run Code Online (Sandbox Code Playgroud)
我调用下面的函数(getTabSetDifferences)传入一个和两个,正如预期的那样,如果存在一些差异,这些值将从HashMap中删除,并且它将与传入测试之前不同.
我希望它们保持不变,所以尝试传递:
getTabSetDifferences((HashMap)one.clone(), (HashMap)two.clone())
Run Code Online (Sandbox Code Playgroud)
这仍然改变了原件,所以我创建了两个相同格式的哈希映射,并克隆了一个和两个,我使用新的哈希映射传入,原始仍然改变.
然后我尝试了:
HashMap<String, List<String>> holdOne = new HashMap<String, List<String>>();
holdOne.putAll(one);
HashMap<String, List<String>> Holdtwo = new HashMap<String, List<String>>();
holdTwo.putAll(two);
Run Code Online (Sandbox Code Playgroud)
现在我可以这样做:
holdTwo.remove(key);
Run Code Online (Sandbox Code Playgroud)
原来没有改变,但如果我用holdOne和holdTwo调用方法它仍然会改变原来的一个和两个哈希图,它们不应该保留吗?该方法正在工作,并找到我想要的差异,并返回.但是我仍然需要原来的两个哈希映射,但无论我调用哪种方式,对holdOne和holdTwo进行的更改都会更改原始内容.这是预期的行为吗?如果是这样,获取与其无关的hashmap副本的正确方法是什么.
getTabSetDifferences(holdOne, holdTwo);
public HashMap<String, List<String>> getTabSetDifferences(HashMap<String, List<String>> hmMain, HashMap<String, List<String>> hmSecond) {
HashMap<String, List<String>> hmDifferences = new HashMap<String, List<String>>();
for (Map.Entry<String, List<String>> entry : hmMain.entrySet()) {
if(hmSecond.containsKey(entry.getKey())) {
entry.getValue().removeAll(hmSecond.get(entry.getKey()));
if (entry.getValue().size() > 0)
hmDifferences.put(entry.getKey(), entry.getValue());
}
else {
hmDifferences.put(entry.getKey(), entry.getValue());
}
}
return hmDifferences;
}
Run Code Online (Sandbox Code Playgroud)