Het overschrijven van de hashCode() methode is nauw verwant aan het overschrijven van equals(): beide methoden vormen de basis voor het juiste gebruik van een object in verzamelingen zoals HashMap, HashSet, Hashtable en andere structuren die afhankelijk zijn van vergelijking en hashfuncties.
Regels:
class User { private String name; public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof User)) return false; User user = (User) o; return Objects.equals(name, user.name); } public int hashCode() { return Objects.hash(name); } }
Vraag: "Wat gebeurt er als twee verschillende objecten volgens equals() dezelfde hashCode() retourneren? Is dit een fout?"
Antwoord: Nee, dit is geen fout. Hash-codecollisies zijn oplosbaar en te verwachten - het is slechts belangrijk dat als objecten gelijk zijn volgens equals, hun hashCode gelijk is. Als verschillende objecten volgens equals eenzelfde hashCode geven, zullen verzamelingen langzamer werken (door een groter aantal collisies), maar correct.
Verhaal
In financiële software werden projecten vergeleken op verschillende velden, maar alleen equals() werd overschreven. Objecten werden opgeslagen in een HashSet, er ontstonden duplicaten omdat hashCode() niet was overschreven en standaard werkte (verschilde per exemplaar).
Verhaal
In het magazijnbeheersysteem werd na wijzigingen in de bedrijfslogica equals() uitgebreid, maar vergeten hashCode() bij te werken. Objecten met verschillende hashCode, maar equals=true, gingen verloren in HashMap (werden niet gevonden op sleutel), wat leidde tot grote financiële fouten.
Verhaal
In de webapplicatie werden veranderlijke velden gebruikt in de berekening van hashCode. Bij het bijwerken van de waarde van een intern veld veranderde de hash, en het object "verdween" voor HashSet/HashMap: het kon niet worden gevonden of verwijderd via standaardmethoden, wat leidde tot geheugenlekken en bugs.