重复的自定义对象被添加到哈希集中

use*_*519 0 java hashcode hashset

我有一个 Employee 类,有 2 个属性 id 和 name。我将重写 hashcode 和 equals 方法,如下所示。

员工.java:

import java.util.Objects;

public class Employee {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + "]";
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个测试类,我正在其中创建一个名为“Chris Gayle”的员工类对象并将其添加到 HashSet 中。之后,我将此现有员工对象的名称修改为“Kieron Pollard”,并将此修改后的员工对象再次添加到哈希集中。

测试集.java

import java.util.HashSet;
import java.util.Set;

public class TestSet {

 public static void main(String[] args) {
     Set<Employee> hashSet = new HashSet<Employee>();

     Employee emp1 = new Employee();
     emp1.setId(1);
     emp1.setName("Chris Gayle");

     hashSet.add(emp1);

     System.out.println(hashSet);

     emp1.setName("Kieron Pollard");
     hashSet.add(emp1);
     System.out.println(hashSet.size());
     System.out.println(hashSet);
}

}
Run Code Online (Sandbox Code Playgroud)

当我打印哈希集的内容时,我给出了相同的员工对象两次,如下所示。

[Employee [id=1, name=Chris Gayle]]
2
[Employee [id=1, name=Kieron Pollard], Employee [id=1, name=Kieron Pollard]]
Run Code Online (Sandbox Code Playgroud)

因为,set 不允许重复的元素,但在输出中我们在上述场景中得到了重复的元素。那么,处理这种行为的正确方法是什么?

rda*_*das 5

你在这里搬起石头砸自己的脚。

@Override
public int hashCode() {
    return Objects.hash(id, name);
}
Run Code Online (Sandbox Code Playgroud)

如果由& &hashCode定义,则在再次将对象添加到 a 之前更改名称,显然会得到重复的条目。提醒:对象的唯一性由- 决定,这就是用来确定对象是否已经在.idnameHashSethashCodeHashSetSet

你的独特性标准是什么?如果id是唯一的,则仅idhashCode.

@Override
public int hashCode() {
    return Objects.hash(id);
}
Run Code Online (Sandbox Code Playgroud)