HashSet中的HashCode行为

时间:2018-01-18 07:55:15

标签: java hashset

我的员工类: -

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。

1 个答案:

答案 0 :(得分:3)

根据您的需要,您只需从hashCode()课程中删除Employee方法即可。默认实现将为不同的对象返回不同的值(但它只查看对象标识,因此如果不覆盖方法,即使其字段中具有相同值的两个对象也会有不同的hashCode

注意:并非100%保证它们不同 - 实际上并没有定义身份哈希码的确切创建方式 - 但实际上它们会有所不同。

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