Одинаковые значения с разными ключами в хэш-карте

Сначала я поместил две записи с одинаковым значением в хэш-карту. Значение двух записей само по себе является картой. Эти записи имеют разные ключи.

Теперь я хочу поместить новые значения в карту (значение) первой записи. Проблема в том, что карта второй записи (ее значение) также изменяется, пока я меняю первую. Два разных ключа как-то ссылаются на одно и то же значение (map).

Что я должен сделать, чтобы редактировать значения изначально одинаковых значений отдельно друг от друга?

2 ответа

По сути, проблема в том, что вы не поместили две карты на карту, а добавили две ссылки на одну карту.

Чтобы иметь две независимые версии внутренней карты во внешней, вам необходимо сделать ее копию, прежде чем помещать ее во второй раз.

Вы должны быть в состоянии сделать копию HashMap используя его clone метод. Обратите внимание, что хотя вы получаете две разные карты, фактические значения на этих двух картах одинаковы. Это означает, что если содержимое скопированной карты изменчиво, и вы меняете их, они все равно изменятся в обоих местах.

Чтобы уточнить:

HashMap<Object, Object> map1 = new HashMap<Object, Object>()// This is your original map.
map1.put("key", mutableObject)
HashMap<Object, Object> map2 = map1.clone();
map2.put("something", "something else");// map1 is unchanged
map2.get("key").change();// the mutable object is changed in both maps.

Хорошо поймать, поместив одну и ту же ссылку под разными ключами. Однако для решения я бы не использовал clone метод, а точнее будет использовать явное копирование: package com.au.psiu;

import java.util.HashMap;
import java.util.Map;

public class NoIdea {

    public static void main(String... args) {
        Map source = new HashMap();

        //Insert value into source
        Map copy1 = new HashMap();
        copy1.putAll(source);
        Map copy2 = new HashMap();
        copy2.putAll(source);

        Map mapOfMaps = new HashMap();
        mapOfMaps.put("key1", copy1);
        mapOfMaps.put("key2", copy2);
        //...and you can update maps separately
    }
}

Также вы можете захотеть взглянуть на проект Google Guava - у них есть много полезных API для коллекций.

Другие вопросы по тегам