Clasa java.util.HashSet, care implementează printre altele interfaţa java.util.Collection, teoretic aderă la acest contract, deşi documentaţia ei (în mod ciudat), e mai vagă decât cea a interfeţei. Practic, pentru eficientizare, metoda contains(), aşa cum este ea implementată în clasa java.util.HashSet, nu ajunge să apeleze metoda equals() pentru verificare, decât dacă la apelul metodei hashCode() (mai rapidă) pe ambele obiecte se returnează aceeaşi valoare.
Documentaţia Java este cea care este deficitară şi derutantă aici. Documentaţia clasei java.util.HashSet ar trebui să specifice exact comportamentul fiecărei metode şi nu doar să enunţe generic în antet o prezumţie („assuming the hash function disperses the elements properly among the buckets” - nu e clar ce înseamnă aici properly).
Deci, dacă cumva ai suprascris equals() pentru o clasă, pentru ca ea să aibă efectul dorit în toate cazurile în care te-ai aştepta, trebuie ca metoda hashCode() a acelui obiect să fie şi ea suprascrisă. Contractul lui hashCode() spune aşa: If two objects are equal according to the equals(Object) method, then calling the
hashCode method on each of the two objects must produce the same integer result. Cum suprascriem hashCode, depinde de noi, atâta vreme cât respectăm acest contract. Dacă nu sunt egale, nu se specifică nimic, pot să difere sau pot să fie identice, dar e de preferat să se încerce ca nici comparaţia hashCode să nu dea fals pozitiv prea uşor.Vezi şi itemul 8 de aici.
