Sobes.tech
Middle

Räägi Java meetodite equals ja hashCode lepingutest.

sobes.tech AI

Vastus AI-lt

  • Refleksiviteet: igaüle mitte-null viidete x puhul peab x.equals(x) tagastama true.

  • Sümbiootilisus: igaüle mitte-null viidete x ja y puhul peab x.equals(y) tagastama true ainult siis, kui y.equals(x) tagastab true.

  • Transitiivsus: igaüle mitte-null viidete x, y ja z puhul, kui x.equals(y) ja y.equals(z) mõlemad tagastavad true, siis peab x.equals(z) samuti tagastama true.

  • Konsistentsus: igaüle mitte-null viidete x ja y puhul, korduvad x.equals(y) kutsed peavad alati tagastama sama väärtuse, kas true või false, tingimusel et equals võrdluses kasutatud teave ei muutu vahepeal.

  • Igaüle mitte-null viidete x puhul peab x.equals(null) tagastama false.

  • Kui kaks objekti on võrdsed vastavalt equals(Object) meetodile, siis hashCode meetodi väljakutse nendele objektidele peab andma sama täisarvulise väärtuse.

  • Ei ole nõutav, et kui kaks objekti ei ole võrdsed equals(java.lang.Object) meetodi järgi, siis hashCode meetodi väljakutse nendele objektidele annaks erinevad täisarvulised väärtused. Kuid programmeerija peaks mõistma, et erinevate hash-koodide genereerimine mitte-võrdsete objektide jaoks võib parandada hash-tabelite jõudlust.

Oluline on üle kirjutada mõlemad meetodid equals ja hashCode, kui üks neist üle kirjutatakse, et säilitada leping. equals meetodi kasutamine ilma hashCode üle kirjutamiseta võib põhjustada kolektsioonide, mis kasutavad hashimise, ebaõiget tööd (näiteks 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; // Refleksivsus
        if (o == null || getClass() != o.getClass()) return false; // Null ja klassi kontroll
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Sisu võrdlus
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Hashi genereerimine väljade põhjal
    }
}