与散列映射中的不同键相同的值

时间:2011-07-14 00:19:00

标签: java hashmap

最初,我将两个具有相同值的条目放入一个hashmap中。两个条目的值本身就是一个映射。这些条目具有不同的键。

现在我想将新值放入第一个条目的地图(值)中。问题是,只要我更改第一个条目,第二个条目的映射(其值)也会更改。两个不同的键以某种方式引用相同的值(map)。

我应该怎样做才能相互分别编辑最初相同值的值?

2 个答案:

答案 0 :(得分:5)

基本上,问题是您没有将两个地图放入地图中,而是将两个引用添加到相同的地图中。

要在外部地图中拥有两个独立版本的内部地图,您需要先将其复制,然后再将其放入。

您应该能够使用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.

答案 1 :(得分:1)

在不同的键下放置相同的引用很好。但是为了解决我不会使用clone方法而是使用显式复制: 包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集合。