困惑为什么我的哈希图正在更新。例如,我有以下哈希图:
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}}
非常感谢帮助,谢谢!
您将需要创建另一个FirstMap对象(另一个哈希映射(。不是同一个哈希图。相同的哈希图肯定会更新值
firstMap.put("Jason", 2);
finalMap.put(1, firstMap);
anotherFirstMap.put("Jason", 15);
finalMap.put(2, anotherFirstMap);
System.out.println(finalMap);
在代码中,当您将"Jason"与值 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);
希望这有帮助。
当您将某些内容放入哈希映射时,哈希映射仅存储对该对象的引用(在本例中为 firstMap
(。它不会复制对象(这将导致您的预期结果(!
当您执行firstMap.put("Jason", 15);
时,您将更改firstMap
。
打印最终地图时,将取消围栏并打印所有参照。但是这两个键都指向同一个对象(您更改的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}}
映射键是唯一的。在指定预先存在的键时向 Map 发出put
时,该键的原始值将被覆盖。
来自java.util.Map#put(K key, V value(:
将指定值与此映射中的指定键相关联(可选操作(。如果映射以前包含键的映射,则旧值将替换为指定的值。(映射 m 据说包含键 k 的映射当且仅当 m.containsKey(k( 返回 true。
要完成您想做的事情,您需要的不仅仅是finalMap
.你需要两张地图:一张用于 {Jason=2},另一张用于 {Jason=15}。