java - HashSet 中的 HashCode 行为

标签 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 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/

相关文章:

带有通配符的java黑名单

c# - 确定 HashSet<String> 是否包含不同大小写的字符串

.net - F#中的哈希散列和.net中的弱哈希表

java - Void 方法缺少返回值?

java - 如何向该白板添加清晰选项?

Java Horner的多项式累加法

java - 按某些键值删除重复项

java - 测试包中的类在 IntelliJ 中编译时不可用

java - 调用 method.invoke(...) 传递 List<Map<String,Object>> 作为参数

java - 如何在没有 EventListener 的情况下以编程方式在 JList 中添加元素?