我有一个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);
}
}
当我打印Record时,即使我只使用关键的CHEMISTRY更改记录,整个哈希映射也会更新。我把它作为输出:
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}}
我不确定问题是什么。
答案 0 :(得分:4)
预计,记录地图中的所有密钥都会引用同一个地图,因此任何更改都会反映在所有条目中,您需要做的是复制每个密钥的地图
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是一个实现,它总是更好地编写接口而不是实现,这将帮助您保持代码可维护,如果您需要更改到map的另一个实现,您只需要更改初始化中使用的类而不需要担心你在应用程序中如何与对象接口。