У меня проблемы с получением отдельной копии моих HashMaps. Под этим я подразумеваю, что после того, как я сделал копию оригинала, внесение изменений в одно не меняет другого.
У меня есть два HashMap в этом формате:
HashMap<String, List<String> one = new HashMap<String, List<String>();
HashMap<String, List<String> two = new HashMap<String, List<String>();
Я вызываю следующую функцию (getTabSetDifferences), передавая один и два, как и ожидалось, если есть некоторые различия, эти значения будут удалены из HashMap и он будет отличаться от того, что было до его сдачи на тест.
Я хочу, чтобы они остались без изменений, поэтому попробовал вставить:
getTabSetDifferences((HashMap)one.clone(), (HashMap)two.clone())
Это все равно изменило оригиналы, поэтому я создал еще две хэш-карты в том же формате и клонировал к ним одну и две, я использовал новые хэш-карты для передачи в, а оригинал все еще был изменен.
Затем я попробовал:
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);
Теперь я могу сделать что-то вроде:
holdTwo.remove(key);
и оригинал не изменился, но если я вызываю метод с помощью holdOne и holdTwo, он все равно изменяет исходную одну и две хэш-карты, не должно они остаются? Метод работает, обнаруживает нужные мне различия и возвращается. Но мне все еще нужно, чтобы исходные две хэш-карты были такими, какими они были, но независимо от того, каким способом я назову, любые изменения, внесенные в holdOne и holdTwo, изменят исходные. Это ожидаемое поведение? Если да, то как правильно получить копию хэш-карты, которая не привязана к ней.
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;
}