我有一个Employee类,如下所示。
Map<Employee, String> empMap = new HashMap<>();
Employee e1 = new Employee(123, "xyz");
empMap.put(e1, "asd");
System.out.println(empMap.size());
System.out.println(empMap.get(e1));
e1.setEmpId(122);
empMap.put(e1, "asd");
System.out.println(empMap.size());
System.out.println(empMap.get(new Employee(122, "xyz")));
System.out.println(empMap.get(new Employee(123, "xyz")));
Set<Employee> mapEmpKeys = empMap.keySet();
mapEmpKeys.forEach(emp -> {
System.out.println("Employee ID: " + emp.getEmpId() + " Employee Name: " + emp.getEmpName());
});
我将这个Employee类对象用作HashMap中的键,如下所示。
1
asd
2
asd
null
Employee ID: 122 Employee Name: xyz
Employee ID: 122 Employee Name: xyz
计划的输出:
cricBall = 20
cricBat = 45
kPad = 70
batGlove = 130
tsmall = 45
tmed = 55
tlar = 65
txl = 75
total = (3 * kPad) + (3 * batGlove) + (3 * cricBall) + (5 * cricBat)
players = 0
while(players < 3):
psize = input("enter the size of the player1(s/m/l/xl): ")
if psize == "s":
total = total + tsmall
elif psize == "m":
total = total + tmed
elif psize == "l":
total = total + tlar
else:
total = total + txl
players += 1
print("The total cost of equipment is:", total)
我的问题是即使作为键的对象是相同的,我也将地图的大小设置为2.有人可以通过将其ID设置为不同的值来更改Employee对象e1并在地图中再次添加它来解释我给出大小为2,当我迭代地图的Key集时,我得到两个条目的相同对象。键在地图中必须是唯一的,对吧?那为什么我两次获得相同的对象密钥? 谢谢!
答案 0 :(得分:5)
当您在HashMap
中改变用作键的实例时,如果修改用于确定相等性的属性或计算hashCode()
,则会中断HashMap
。
第一次将密钥放入Map时,它被放入与基于值123和“xyz”计算的hashCode()
对应的存储桶中。
第二次将相同的密钥放在Map中时,它被放入一个不同的桶中,该桶与基于值122和“xyz”计算的hashCode()
相对应。
由于HashMap
首先找到与密钥hashCode()
匹配的存储区,并且只有稍后检查该存储区中的所有密钥是否存在密钥相等,如果给定密钥的hashCode()
已更改,对put
的第二次调用将尝试在新存储桶中找到它(与新的hashCode()
匹配),并且不会在那里找到它。因此,相同的密钥会被添加两次。