ProgrammatieJava ontwikkelaar

Hoe werkt de mechanism voor het overschrijven van de hashCode() methode in Java, welke regels moeten daarbij worden gevolgd, en welke kritieke bugs kunnen optreden bij schending van deze regels?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

  • Als je equals() overschrijft, moet je ook hashCode() overschrijven.
  • Objecten die gelijk zijn volgens equals() moeten dezelfde hashCode() retourneren.
  • Het wordt aanbevolen om standaardmethoden voor het genereren van hashes te gebruiken, zoals Objects.hash() of IDE-sjablonen, om fouten te voorkomen.
  • hashCode() moet gedurende de "levensduur" van hetzelfde object dezelfde waarde retourneren (als de velden die deelnemen aan hashCode onveranderd zijn).
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); } }

Misleidende vraag.

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.

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp.


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.