Java哈希图更新,当我不希望它更新


有点

困惑为什么我的哈希图正在更新。例如,我有以下哈希图:

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}。

相关内容

最新更新