我的员工类:-
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();
}
}
利用率:-
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 和 employee2 在不同的桶中并且具有不同的 HashCode。 示例输出:-
true employee.hashCode(): 0 employee2.hashCode():0
代码有什么问题?
我想要的只是不同的 hashcode
(不同的桶)和 equals
方法的正确实现,该方法返回 employeesList.contains(employee2)
false。
最佳答案
对于您想要的,您可以从Employee
类中删除hashCode()
方法。默认实现将为不同的对象返回不同的值(但它只查看对象标识,因此即使两个在其字段中具有相同值的对象也会有不同的 hashCode
如果你不重写该方法)
注意:不能 100% 保证它们是不同的 - 实际上它没有定义身份哈希码是如何创建的 - 但它们在实践中会有所不同。
您当前代码失败的原因是 Math.random()
返回一个从 0 到 1(但从不为 1)的值。如果将其转换为 (int)
,结果始终为零。
关于java - HashSet 中的 HashCode 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48316290/