Sobes.tech
Middle

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 x sollte x.equals(x) true zurückgeben.

  • Symmetrie: Für alle nicht-null Referenzwerte x und y sollte x.equals(y) nur dann true zurückgeben, wenn y.equals(x) ebenfalls true ist.

  • Transitivität: Für alle nicht-null Referenzwerte x, y und z, wenn x.equals(y) true ist und y.equals(z) true ist, dann sollte auch x.equals(z) true sein.

  • Konsistenz: Für alle nicht-null Referenzwerte x und y sollten wiederholte Aufrufe von x.equals(y) konstant true oder konstant false zurückgeben, vorausgesetzt, keine Informationen, die in den equals-Vergleichen der Objekte verwendet werden, ändern sich zwischen den Aufrufen.

  • Für jeden nicht-null Referenzwert x sollte x.equals(null) false zurückgeben.

  • Wenn zwei Objekte gemäß der Methode equals(Object) gleich sind, sollte der Aufruf der Methode hashCode fü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 von hashCode fü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
    }
}