Java Hashmap在我不希望它

时间:2017-06-09 20:44:59

标签: java hashmap

为什么我的hashmap正在更新有点困惑。举个例子,我有以下的哈希图:

Map<String, Integer> firstMap = new HashMap<String, Integer>();

Map<Integer, Map<String, Integer>> finalMap = new HashMap<Integer, Map<String, Integer>>();

现在,当我运行时:

firstMap.put("Jason", 2);
finalMap.put(1, firstMap);

firstMap.put("Jason", 15);
finalMap.put(2, firstMap);
System.out.println(finalMap);

我明白了:

{1={Jason=15}, 2={Jason=15}}

为什么我不能这样做呢?这就是我想要的。

{1={Jason=2}, 2={Jason=15}}

非常感谢帮助,谢谢!

4 个答案:

答案 0 :(得分:2)

您需要创建另一个FirstMap对象(另一个hashmap)。不一样的hashmap。 samehashmap肯定会更新值

firstMap.put("Jason", 2);
finalMap.put(1, firstMap);

anotherFirstMap.put("Jason", 15);
finalMap.put(2, anotherFirstMap);
System.out.println(finalMap);

答案 1 :(得分:1)

当您将某些内容放入散列映射时,散列映射只会存储对该对象的引用(在本例中为firstMap)。它不会复制对象(这会导致您的预期结果)!

执行firstMap.put("Jason", 15);后,您需要更改firstMap

当您打印finalMap时,所有引用都会被解除并打印出来。但是两个键都会导致相同的对象(您更改了firstMap)。

为了说明:

firstMap.put("Jason", 2);
System.out.println(firstMap); // {"Jason"=2}
finalMap.put(1, firstMap);
System.out.println(finalMap); // {1={"Jason"=15}}

firstMap.put("Jason", 15);
System.out.println(firstMap); // {"Jason"=15}
finalMap.put(2, firstMap);
System.out.println(finalMap); // {1={"Jason"=15},2={"Jason"=15}}

答案 2 :(得分:1)

在您的代码中,当您关联&#34; Jason&#34;对于值15,您实际上覆盖了值2,因为您仍在使用相同的firstMap实例。

为了获得您要求代码的内容,请改为:

Map<String, Integer> firstMap = new HashMap<String, Integer>();

Map<Integer, Map<String, Integer>> finalMap = new HashMap<Integer, Map<String, Integer>>();

firstMap.put("Jason", 2);
finalMap.put(1, firstMap);

// here we create a new instance of that HashMap
firstMap = new HashMap<String, Integer>();

firstMap.put("Jason", 15);
finalMap.put(2, firstMap);
System.out.println(finalMap);

希望这有帮助。

答案 3 :(得分:0)

地图键是唯一的。在指定预先存在的密钥时向地图发出put时,该密钥的原始值将被覆盖。

From java.util.Map#put(K key, V value)

  

将指定的值与此映射中的指定键相关联(可选操作)。如果映射先前包含键的映射,则旧值将替换为指定的值。 (当且仅当m.containsKey(k)返回true时,地图m才包含密钥k的映射。)

要完成您想要做的事,您需要的不仅仅是finalMap。您需要两张地图:一张用于{Jason = 2},另一张用于{Jason = 15}。