Поведение при копировании HashMap Я не могу выяснить

У меня проблемы с получением отдельной копии моих 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;
}
5
задан Green 20 October 2011 в 16:12
поделиться