Same Object用作Map中两个条目的键

时间:2018-05-06 09:58:21

标签: java object hashmap

我有一个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集时,我得到两个条目的相同对象。键在地图中必须是唯一的,对吧?那为什么我两次获得相同的对象密钥? 谢谢!

1 个答案:

答案 0 :(得分:5)

当您在HashMap中改变用作键的实例时,如果修改用于确定相等性的属性或计算hashCode(),则会中断HashMap

第一次将密钥放入Map时,它被放入与基于值123和“xyz”计算的hashCode()对应的存储桶中。

第二次将相同的密钥放在Map中时,它被放入一个不同的桶中,该桶与基于值122和“xyz”计算的hashCode()相对应。

由于HashMap首先找到与密钥hashCode()匹配的存储区,并且只有稍后检查该存储区中的所有密钥是否存在密钥相等,如果给定密钥的hashCode()已更改,对put的第二次调用将尝试在新存储桶中找到它(与新的hashCode()匹配),并且不会在那里找到它。因此,相同的密钥会被添加两次。