Java HashSet中的HashCode行为

Java HashSet中的HashCode行为,java,hashset,Java,Hashset,我的员工类别:- 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 na

我的员工类别:-

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());
代码有什么问题?
我想要的只是不同的
hashcode
(不同的bucket)和
equals
方法的正确实现,该方法返回
employeesList.contains(employee2)
false。

对于您想要的,您可以从
Employee
类中删除
hashcode()
方法。默认实现将为不同的对象返回不同的值(但它只查看对象标识,因此如果不重写该方法,即使两个字段中具有相同值的对象也将具有不同的
hashCode
s)

注意:不能100%保证它们是不同的-实际上它没有定义标识哈希代码是如何创建的-但实际上它们是不同的


当前代码失败的原因是
Math.random()
返回从0到1的值(但从不返回1)。如果将其转换为
(int)
,结果始终为零。

它们具有相同的
hashcode
,因为
Math.random()
返回一个小于
1.0
的正
double
值,当转换为
int
时,该值将始终产生
0
。请阅读hashcode()的javadoc。不要使用
==
来比较字符串。对于给定的name和age值,hashCode值应始终返回相同的值。使用
Objects.hash(姓名、年龄)
。始终在执行时返回0将使哈希集效率低下。始终返回随机值将使其无法工作,因为这不符合哈希代码的约定。不同的哈希代码并不一定意味着不同的bucket。生成随机哈希代码会破坏所需的约定,并将导致哈希集完全失败。您将无法在集合中找到对象。您必须编写一个
hashCode()
方法,该方法使用定义相等(名称和年龄)的相同字段。
true employee.hashCode():  0  employee2.hashCode():0