Связь equals и hashCode в Java
Если в классе переопределили equals, почти всегда
переопределяют и hashCode. Правило контракта такое:
когда a.equals(b) даёт true, у a и b
должен совпадать hashCode(). Иначе HashSet
и HashMap могут вести себя неожиданно - «равный»
объект не найдётся в коллекции.
Обратное не обязательно: одинаковый хеш-код не гарантирует
равенство через equals. Но для равных по equals
объектов хеш-коды должны совпасть.
Класс Post с согласованными equals и
hashCode по полю title:
import java.util.Objects;
class Post {
public String title;
public Post(String title) {
this.title = title;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Post other)) {
return false;
}
return Objects.equals(title, other.title);
}
@Override
public int hashCode() {
return Objects.hash(title);
}
}
Создадим две равные записи и сравним equals вместе с
hashCode:
Post first = new Post("News");
Post second = new Post("News");
System.out.println(first.equals(second));
System.out.println(first.hashCode() == second.hashCode());
Вспомогательные методы Objects.equals и
Objects.hash из java.util учитывают
null в полях и сокращают шаблонный код.
Проверим, что два равных Post попадают в
HashSet как один элемент:
import java.util.HashSet;
import java.util.Objects;
public class Main {
public static void main(String[] args) {
Post first = new Post("News");
Post second = new Post("News");
HashSet<Post> set = new HashSet<>();
set.add(first);
set.add(second);
System.out.println(set.size());
}
}
Сделайте класс Employee с полем id типа
int. Переопределите equals и hashCode
по id. Проверьте, что у двух объектов с одним
id совпадает hashCode().