Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvOpOlEHC 53 of 147 menu
◀ ▶

Связь 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().

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить