为什么我的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}}
非常感谢帮助,谢谢!
答案 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}。