Interviewfrage für Java-Entwickler

Wie lautet der Vertrag zwischen equals und hashCode, und was geht kaputt, wenn du ihn verletzt?

Worauf der Interviewer abzielt, wie du deine Antwort aufbaust und ein gesprochenes Beispiel zum Anpassen.

Kurzantwort

Wenn zwei Objekte laut equals gleich sind, müssen sie denselben hashCode liefern; ungleiche Objekte dürfen sich einen Hash teilen, tun es idealerweise aber nicht. Verletzt du das, spielen hash-basierte Collections verrückt: ein Objekt, das du in eine HashMap gelegt hast, wird unerreichbar, weil das Lookup in einem anderen Bucket landet. equals muss außerdem reflexiv, symmetrisch, transitiv und konsistent sein, und ein Feld nach dem Einfügen zu ändern, das im Hash steckt, verliert den Eintrag genauso zuverlässig.

Warum Interviewer das fragen

Das ist ein Grundlagencheck, der echte Bugs vorhersagt, besonders in Codebases, die Entities als Map-Keys oder in Sets verwenden. Der Interviewer will die Implikation in eine Richtung korrekt formuliert hören, dazu das praktische Versagen: ein Set, das ein Element enthält, aber nicht findet. Nachfragen gehen meist zu JPA-Entities, wo equals auf einer generierten id die klassische Falle ist, und zu Records, die dir beides generieren.

So baust du deine Antwort auf

  • Formuliere den Vertrag als Implikation, nicht als Äquivalenz.
  • Beschreib das konkrete Versagen in einer HashMap oder einem HashSet.
  • Erwähne die Veränderlichkeit von Feldern, die im Hash stecken.
  • Sag, was du in der Praxis machst: Records oder ein stabiler Business-Key.

Beispielantwort

Gesprochenes Beispiel, erste Person

Die Regel gilt nur in eine Richtung: gleiche Objekte müssen gleiche Hash-Codes haben, gleiche Hash-Codes bedeuten aber keine Gleichheit, weshalb eine Map innerhalb des Buckets trotzdem equals aufruft. Überschreibe ich equals und vergesse hashCode, landen zwei gleiche Objekte in unterschiedlichen Buckets, ich kann also etwas in ein HashSet legen und contains liefert für ein identisches Objekt false. Die subtilere Variante ist Mutation. Ändert sich ein Feld, das im Hash steckt, nachdem das Objekt im Set liegt, sitzt der Eintrag im falschen Bucket und ist praktisch verloren, was sich als Leak zeigt, weil er auch nie mehr entfernt werden kann. In der Praxis nehme ich Records für Value Types, dann werden beide generiert und sind konsistent. Bei JPA-Entities bin ich vorsichtig, denn eine generierte id bedeutet, dass sich equals ändert, sobald die Entity persistiert wird, eine Entity im HashSet verhält sich also vor dem Flush anders als danach. Ich nehme einen stabilen fachlichen Schlüssel, wenn es einen gibt, und lege ungespeicherte Entities sonst gar nicht erst in hash-basierte Collections.

Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.

So funktioniert es

Nachfragen, mit denen du rechnen solltest

  • Wie würdest du equals für eine JPA-Entity mit generierter id implementieren?
  • Was generiert ein Record für dich, und wann ist das nicht das, was du willst?
  • Warum verschlechtert eine schlechte Hash-Funktion eine HashMap, obwohl sie korrekt ist?

Weitere Fragen für Java-Entwickler

Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.

Meine Fragen vorhersagen

Üb die harten Fragen, bevor sie gestellt werden

Trainier mit einem Live-Copiloten und geh dann vorbereitet rein. Ein $29 Session Pass bringt dich durch das Vorstellungsgespräch, ohne Abo und ohne Bindung.

GhostPilot holen