Why must `equals()` and `hashCode()` follow a contract? | LetsGit.IT