Контракт между методами `hashCode()` и `equals()` заключается в следующем: 1. Равенство объектов: Если два объекта равны согласно методу `equals()` , то их хэш-коды должны быть равными. Это означает, что если `obj1.equals(obj2)` , то `obj1.hashCode() == obj2.hashCode()` . 2. Различные объекты: Обратное не обязательно верно. Два объекта с одинаковыми хэш-кодами не обязательно равны по методу `equals()` . Это связано с возможностью возникновения коллизий хэш-кодов, когда разные объекты имеют одинаковый хэш-код. 3. Переопределение: Оба метода ( `hashCode()` и `equals()` ) должны быть переопределены вместе. Если переопределен один из них, то обязательно нужно переопределить и другой метод, чтобы сохранить согласованность между ними. Соблюдение контракта между `hashCode()` и `equals()` крайне важно при использовании объектов в коллекциях, основанных на хэш-таблицах (например, `HashMap` , `HashSet` ), а также при использовании объектов в качестве ключей в хэш-картах (например, в `HashMap` ). Несоблюдение контракта может привести к неправильному функционированию таких коллекций.