我的员工类: -
name
利用率: -
class Employee {
String name;
int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (!(obj instanceof Employee))
return false;
Employee employee = (Employee) obj;
return employee.getAge() == this.getAge()
&& employee.getName() == this.getName();
}
// commented
@Override
public int hashCode() {
return (int) Math.random();
}
}
我会得到 True 。但我应该得到假的? 因为员工和员工2处于不同的存储桶中并且具有不同的HashCode。 样本输出: -
Employee employee = new Employee("rajeev", 24);
Employee employee1 = new Employee("rajeev", 25);
Employee employee2 = new Employee("rajeev", 24);
HashSet<Employee> employeesList = new HashSet<Employee>();
employeesList.add(employee );
System.out.println(employeesList.contains(employee2));
System.out.println("employee.hashCode(): " + employee.hashCode()
+ " employee2.hashCode():" + employee2.hashCode());
代码有什么问题?
我想要的只是true employee.hashCode(): 0 employee2.hashCode():0
(不同的存储桶)和hashcode
方法的正确实现,它返回equals
false。
答案 0 :(得分:3)
根据您的需要,您只需从hashCode()
课程中删除Employee
方法即可。默认实现将为不同的对象返回不同的值(但它只查看对象标识,因此如果不覆盖方法,即使其字段中具有相同值的两个对象也会有不同的hashCode
注意:并非100%保证它们不同 - 实际上并没有定义身份哈希码的确切创建方式 - 但实际上它们会有所不同。
当前代码失败的原因是Math.random()
返回的值从0到1(但从不为1)。如果将其强制转换为(int)
,则结果始终为零。