У меня есть класс Employee с двумя атрибутами id и name. Я переопределяю хэш-код и метод equals, как указано ниже.
Employee.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 + "]";
}
}
А теперь у меня есть тестовый класс, в котором я создаю объект класса сотрудников с именем «Chris Gayle» и добавляю его в HashSet. После этого я изменяю имя этого существующего объекта сотрудника на «Kieron Pollard» и снова добавляю этот измененный объект сотрудника в hashset.
TestSet.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);
}
}
Когда я распечатываю содержимое хешсета, я даю тот же объект сотрудника два раза, как указано ниже.
[Employee [id=1, name=Chris Gayle]]
2
[Employee [id=1, name=Kieron Pollard], Employee [id=1, name=Kieron Pollard]]
Поскольку set не допускает дублирование элементов, но в выводе мы получаем дубликаты в приведенном выше сценарии. Итак, как правильно обращаться с такого рода поведением.