Erzählen Sie mir von den Verträgen der Methoden equals und hashCode in Java.
sobes.tech KI
Antwort von AI
-
Reflexivität: Für jeden nicht-null Referenzwert
xsolltex.equals(x)truezurückgeben. -
Symmetrie: Für alle nicht-null Referenzwerte
xundysolltex.equals(y)nur danntruezurückgeben, wenny.equals(x)ebenfallstrueist. -
Transitivität: Für alle nicht-null Referenzwerte
x,yundz, wennx.equals(y)trueist undy.equals(z)trueist, dann sollte auchx.equals(z)truesein. -
Konsistenz: Für alle nicht-null Referenzwerte
xundysollten wiederholte Aufrufe vonx.equals(y)konstanttrueoder konstantfalsezurückgeben, vorausgesetzt, keine Informationen, die in denequals-Vergleichen der Objekte verwendet werden, ändern sich zwischen den Aufrufen. -
Für jeden nicht-null Referenzwert
xsolltex.equals(null)falsezurückgeben. -
Wenn zwei Objekte gemäß der Methode
equals(Object)gleich sind, sollte der Aufruf der MethodehashCodefür beide Objekte denselben Ganzzahlwert ergeben. -
Es ist nicht erforderlich, dass, wenn zwei Objekte gemäß der Methode
equals(java.lang.Object)ungleich sind, die Aufrufe vonhashCodefür beide Objekte unterschiedliche Ganzzahlenwerte liefern. Der Programmierer sollte jedoch verstehen, dass die Erzeugung unterschiedlicher Hash-Codes für ungleiche Objekte die Leistung von Hash-Tabellen verbessern kann.
Es ist wichtig, beide Methoden equals und hashCode zu überschreiben, wenn eine von ihnen überschrieben wird, um den Vertrag einzuhalten. Die Verwendung von equals ohne Überschreibung von hashCode kann zu inkorrektem Verhalten von Hash-basierten Sammlungen führen (z.B. HashMap, HashSet).
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true; // Reflexivität
if (o == null || getClass() != o.getClass()) return false; // Null- und Typprüfung
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Vergleich des Inhalts
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Hash-Generierung basierend auf den Feldern
}
}