gpt4 book ai didi

java - java 中错误的 hashMap 更新

转载 作者:行者123 更新时间:2023-11-30 06:51:37 30 4
gpt4 key购买 nike

我有一个 hashMap 定义如下:

public class Test {
private static HashMap<String, HashMap<String, Integer>> Record = new HashMap<>();
public static void SetRecord()
{
HashMap<String,Integer> inner= new HashMap<>();
inner.put("CHEMISTRY", 2);
inner.put("MATHS", 5);
inner.put("PHYSICS", 3);

Record.put("12/12/2016", inner);
Record.put("3/12/2016", inner);
Record.put("3/02/2016", inner);
}

public static void main(String [] args)
{
SetRecord();
HashMap<String, Integer>InnerMap= new HashMap<>();
int seatcount=0;
seatcount= Record.get("3/02/2016").get("CHEMISTRY");
seatcount--;

InnerMap=Record.get("3/02/2016");

InnerMap.put("CHEMISTRY",seatcount);

Record.put("CHEMISTRY",InnerMap);

System.out.println("Record: "+ Record);
}
}

当我打印记录时,即使我只更改键为 CHEMISTRY 的记录,整个 HashMap 也会更新。我有这个作为输出:

Record: {3/02/2016={CHEMISTRY=1, MATHS=5, PHYSICS=3}, 12/12/2016={CHEMISTRY=1, MATHS=5, PHYSICS=3}, 3/12/2016={CHEMISTRY=1, MATHS=5, PHYSICS=3}}

我不确定是什么问题。

最佳答案

这是预料之中的,记录映射中的所有键都引用同一个映射,因此它们的任何更改都将反射(reflect)在所有条目中,您需要做的是为每个键复制映射

         Record.put("12/12/2016", inner);
Record.put("3/12/2016", new HashMap<String,Integer>(inner));
Record.put("3/02/2016", new HashMap<String,Integer>(inner));

不鼓励这样做的另一件事

               HashMap<String,Integer> inner = new HashMap<>();

你最好这样做

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

HashMap 是一个实现,为接口(interface)而不是实现编写代码总是更好,这将帮助您保持代码的可维护性,如果您需要更改为 map 的另一个实现,您只需要更改初始化中使用的类而无需担心你如何在你的应用程序中连接你的对象。

关于java - java 中错误的 hashMap 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40011178/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com