Sobes.tech
Middle

Beszélj a Java-ban az equals és hashCode metódusok szerződéseiről.

sobes.tech MI

Válasz az MI-től

  • Reflexivitás: minden nem null referenciaérték x esetén x.equals(x)-nek true-t kell visszaadnia.

  • Szimmetria: minden nem null referenciaérték x és y esetén, x.equals(y) csak akkor legyen true, ha y.equals(x) is true.

  • Transzitivitás: minden nem null referenciaérték x, y és z esetén, ha x.equals(y) true és y.equals(z) true, akkor x.equals(z) is true kell, hogy legyen.

  • Konzisztencia: minden nem null referenciaérték x és y esetén, többszöri x.equals(y) hívásnak folyamatosan true-t vagy false-t kell adnia, feltéve, hogy az equals összehasonlásokban használt információk nem változnak a hívások között.

  • Minden nem null referenciaérték x esetén x.equals(null)-nak false-t kell adnia.

  • Ha két objektum az equals(Object) módszer szerint egyenlő, akkor mindkettő hashCode hívásának ugyanazt az egész szám értéket kell adnia.

  • Nem szükséges, hogy ha két objektum nem egyenlő az equals(java.lang.Object) szerint, akkor a hashCode hívásuk különböző egész számokat adjon. Azonban a programozónak értenie kell, hogy a különböző hash kódok generálása nem egyenlő objektumokra javíthatja a hash táblák teljesítményét.

Fontos, hogy mindkét módszert, az equals-t és a hashCode-t felülírjuk, ha az egyik felülírásra kerül, a szerződés betartása érdekében. Az equals használata anélkül, hogy a hashCode-t felülírnánk, helytelen működéshez vezethet hash-alapú gyűjteményekben (pl. 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ás
        if (o == null || getClass() != o.getClass()) return false; // null és típus ellenőrzése
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Tartalom összehasonlítása
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Hash generálása a mezők alapján
    }
}