Wie überschreibt man die Methode equals in Java richtig?
sobes.tech KI
Antwort von AI
// Beispiel für eine minimal korrekte Überschreibung von equals
class MyClass {
private int id;
private String name;
public MyClass(int id, String name) {
this.id = id;
this.name = name;
}
@Override // Obligatorische Annotation
public boolean equals(Object o) {
// 1. Identitätsprüfung
if (this == o) return true;
// 2. Null- und Klassenvergleich
// Verwendung von getClass() für eine strenge Überprüfung
if (o == null || getClass() != o.getClass()) return false;
// 3. Typumwandlung
MyClass myClass = (MyClass) o;
// 4. Vergleich der bedeutenden Felder
return id == myClass.id &&
// Verwendung von Objects.equals zum Vergleich der Objekte (behandelt null)
Objects.equals(name, myClass.name);
}
}
Regeln für eine korrekte Überschreibung von equals (gemäß dem Vertrag von Object.equals):
- Reflexivität: Für jeden Nicht-Null-Wert
xmussx.equals(x)truezurückgeben. - Symmetrie: Für alle Nicht-Null-Werte
xundymussx.equals(y)truesein, genau dann, wenny.equals(x)trueist. - Transitivität: Für Nicht-Null-Werte
x,yundzgilt: Wennx.equals(y)undy.equals(z)truesind, dann muss auchx.equals(z)truesein. - Konsistenz: Mehrfache Aufrufe von
x.equals(y)sollten immer dasselbe Ergebnis liefern, solange sich die Vergleichsinformationen nicht ändern. - Für jeden Nicht-Null-Wert
xmussx.equals(null)falsezurückgeben.
Es wird empfohlen, Objects.equals(obj1, obj2) für einen sicheren Vergleich zu verwenden, da es null-Werte korrekt behandelt.
Immer hashCode() überschreiben, wenn equals() überschrieben wird, gemäß dem allgemeinen Vertrag von Object.hashCode: Wenn zwei Objekte gleich sind (equals()), müssen ihre Hash-Codes gleich sein. Das Gegenteil ist nicht erforderlich. Das Nichtbeachten dieses Grundsatzes kann zu fehlerhaftem Verhalten von Hash-basierten Sammlungen (z.B. HashMap, HashSet) führen.
// Beispiel für einen passenden hashCode für MyClass
class MyClass {
private int id;
private String name;
// ... Konstruktor und equals wie oben ...
@Override
public int hashCode() {
// Verwendung von Objects.hash für eine einfache Hash-Berechnung
return Objects.hash(id, name);
}
}
Die automatische Generierung der Methoden equals und hashCode ist in IDEs (IntelliJ IDEA, Eclipse) möglich und eine bewährte Praxis.
Verwenden Sie instanceof anstelle von getClass(), nur wenn die Klasse Teil einer Vererbungs-Hierarchie ist und Sie möchten, dass Objekte der Superklasse und der Unterklasse als gleich gelten, wenn sie denselben Zustand haben. In den meisten Fällen ist die Verwendung von getClass() für eine strenge Überprüfung vorzuziehen.