gpt4 book ai didi

java - hashCode 和 Equals 在 Map 键中无法正常工作

转载 作者:行者123 更新时间:2023-12-01 22:43:18 25 4
gpt4 key购买 nike

我有 Employee 类,并希望使用该类作为 HashMap 中的键,并且该映射的值将是一个字符串。然而,为了实现这一点,我重写了 Employee 类本身中的 equals 和 hashcode 方法。我有另一个类来测试 Employee 类 key 是否正常工作。经过测试,我发现map存储了重复的key。请找到以下源代码和输出:

Employee.java

public class Employee {

private int empId;
private String empName;
private int empAge;

Employee(){}

public int getEmpId() {
return empId;
}

public void setEmpId(int empId) {
this.empId = empId;
}

public String getEmpName() {
return empName;
}

public void setEmpName(String empName) {
this.empName = empName;
}

public int getEmpAge() {
return empAge;
}

public void setEmpAge(int empAge) {
this.empAge = empAge;
}

@Override
public boolean equals(Object obj) {
if(obj == null) return false;
if(!(obj instanceof Employee)) return false;

Employee e = (Employee)obj;

return e.empId == this.empId;
}

@Override
public int hashCode() {
return this.empId;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return "Id : "+empId+" Name : "+empName+" Age : "+empAge;
}
}

TestEmployee.java

import java.util.HashMap;
import java.util.Map;


public class TestEmployee {

/**
* @param args
*/
public static void main(String[] args) {

Map<Employee, String> empMap = new HashMap<Employee, String>();

Employee emp1 = new Employee();
emp1.setEmpId(10);
emp1.setEmpName("A");
emp1.setEmpAge(20);

Employee emp2 = new Employee();
emp2.setEmpId(20);
emp2.setEmpName("B");
emp2.setEmpAge(21);

empMap.put(emp1, "1");
empMap.put(emp2, "2");

System.out.println(empMap);

emp1.setEmpId(20);

System.out.println(" emp1.equals(emp2) : "+emp1.equals(emp2));
System.out.println(" emp1.hashCode() : "+emp1.hashCode()+" emp2.hashCode() : "+emp2.hashCode());

System.out.println(empMap);

}

}

输出:

{Id : 20 Name : B Age : 21=2, Id : 10 Name : A Age : 20=1}
emp1.equals(emp2) : true
emp1.hashCode() : 20 emp2.hashCode() : 20
{Id : 20 Name : B Age : 21=2, Id : 20 Name : A Age : 20=1}

请告诉我如何在映射键中使用唯一的员工 - 唯一性将根据员工 ID 决定。

最佳答案

当对象位于 HashMap 中时,请勿不要更新用于哈希码的值。哈希码将用于决定将对象放置在哪里。如果您之后更新它,则 HashMap 不会“拾取”此更新,因此最好的情况是您有重复项,最坏的情况是您无法再检索连接到更新的键的值。

更新

请检查 javadoc 以获取更多信息,但 HashMap 会根据键的哈希码选择一个存储桶来放入值。如果您尝试使用键检索值,它将查看键的哈希码,确定它应该位于哪个存储桶中,然后检查该存储桶并检索值。

但是,如果在 put() 和 get() 之间键的哈希码发生变化, HashMap 可能会将其放入存储桶“A”并尝试将其放入存储桶“B”。

关于java - hashCode 和 Equals 在 Map 键中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25779995/

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