Java-Sammlungen – hashCode() und equals() – Wie kann man die equals()- und hashcode()-Methode in Java überschreiben?

Veröffentlicht: 2018-08-08
Java Collections hashCode und gleich

equals() und hashCode() in Java sind zwei grundlegende Methoden, die in der Object-Klasse und einem Teil oder einer Kern-Java-Bibliothek deklariert werden.

Wenn Sie eines der folgenden Probleme in Java haben, sind Sie hier richtig.

  • Java-Praktiken -> Implementieren von equals
  • override – Überschreiben von equals und hashCode in Java
  • So überschreiben Sie die Methode equals () in Java
  • So überschreiben Sie die Methode hashCode () in Java
  • So überschreiben Sie die Methode equals und hashCode in Java
  • Wie und warum die equals-Methode in Java überschrieben wird
  • Warum hashcode() immer überschreiben, wenn equals() überschrieben wird?

Werfen wir einen Blick auf ein einfaches Beispiel, um zunächst die Reference Equality und die Logical Equality zu verstehen. Der Gleichheitsoperator (==) vergleicht die Referenzen (Adressen im Speicher) der beiden Strings als zwei verschiedene Zahlen – dies wird als Reference equality bezeichnet.

Die Logical equality vergleicht die Daten der Objekte anstelle des Wertes der Referenzen.

Ausgabe:

hashCode und equals sind eng verwandt:

  • Wenn Sie equals überschreiben, müssen Sie hashCode überschreiben.
  • hashCode muss gleiche Werte für gleiche Objekte generieren.
  • equals und hashCode müssen von same set of significant fields abhängen. Sie müssen bei beiden Methoden denselben Satz von Feldern verwenden. Sie müssen nicht alle Felder verwenden. Beispielsweise sollte ein berechnetes Feld, das von anderen abhängt, sehr wahrscheinlich aus equals und hashCode weggelassen werden.

Bei der Implementierung von equals werden Felder je nach Typ unterschiedlich verglichen:

  • Objektfelder, einschließlich Sammlungen: verwenden Sie equals
  • typsichere Aufzählungen: Verwenden Sie entweder equals oder == (in diesem Fall sind sie gleich)
  • möglicherweise-Null-Objektfelder : Verwenden Sie sowohl == als auch gleich
  • Array-Felder: Verwenden Arrays.equals
  • primitive Felder außer Float oder Double : verwenden Sie ==
  • float : Konvertieren in int mit Float.floatToIntBits , verwenden Sie dann ==
  • double : mit Double.doubleToLongBits in long umwandeln, dann == verwenden

HashCode implementieren:

  • Wenn eine Klasse equals überschreibt, muss sie hashCode überschreiben
  • Wenn sie beide überschrieben werden, müssen equals und hashCode denselben Satz von Feldern verwenden
  • Wenn zwei Objekte gleich sind, müssen ihre hashCode- Werte ebenfalls gleich sein
  • Wenn das Objekt unveränderlich ist, ist hashCode ein Kandidat für Caching und Lazy-Initialisierung

Es ist ein weit verbreiteter Irrglaube, dass hashCode eine eindeutige Kennung für ein Objekt bereitstellt. Es tut nicht.

Gemäß allgemeinem Vertrag muss die Methode equals() in Java reflexiv, symmetrisch, transitiv und konsistent sein, und jede Nicht-Null-Referenz muss falsch zurückgeben. Mit anderen Worten, für beliebige Werte von a, b und c müssen die folgenden Tests immer bestanden werden:

Verwenden Sie für die Best Practice die folgenden Schritte, um Ihre Methode equals () zu implementieren:

  • Verwenden Sie this == that, um die Referenzgleichheit zu überprüfen
  • Verwenden Sie instanceof , um den richtigen Argumenttyp zu testen
  • Wandeln Sie das Argument in den richtigen Typ um
  • Vergleichen Sie signifikante Felder auf Gleichheit

Hier ist ein vollständiges Beispiel.

CrunchifyImplementEqualsHashCode.java

Ausgabe der Eclipse-Konsole: