Sobes.tech
Middle

Papaskink apie equals ir hashCode metodų sutartis Java kalboje.

sobes.tech AI

Atsakymas iš AI

  • Refleksiškumas: bet kokiai nuliui nenuleidžiamai nuorodai x, x.equals(x) turi grąžinti true.

  • Simetrija: bet kokiai nuliui nenuleidžiamai nuorodai x ir y, x.equals(y) turi grąžinti true jei ir tik jei y.equals(x) grąžina true.

  • Transityvumas: bet kokiai nuliui nenuleidžiamai nuorodai x, y ir z, jei x.equals(y) grąžina true ir y.equals(z) grąžina true, tada x.equals(z) turi grąžinti true.

  • Nuoseklumas: bet kokiai nuliui nenuleidžiamai nuorodai x ir y, daugybiniai x.equals(y) iškvietimai turi nuolat grąžinti true arba nuolat false, jei nėra keičiamas naudojamos equals palyginimo informacijos turinys.

  • Bet kokiai nuliui nenuleidžiamai nuorodai x, x.equals(null) turi grąžinti false.

  • Jei du objektai yra lygūs pagal equals(Object) metodą, tada hashCode metodo iškvietimas abiem objektams turi duoti tą pačią sveikojo skaičiaus reikšmę.

  • Nereikalaujama, kad jei du objektai nėra lygūs pagal equals(java.lang.Object) metodą, hashCode metodo iškvietimas abiem objektams duotų skirtingas sveikojo skaičiaus reikšmes. Tačiau programuotojas turi suprasti, kad skirtingų hash kodų generavimas ne lygiesiems objektams gali pagerinti hash lentelių našumą.

Svarbu perrašyti abu metodus equals ir hashCode, jei vienas iš jų perrašomas, kad būtų išlaikytas kontraktas. equals metodo naudojimas be hashCode perrašymo gali sukelti netinkamą kolekcijų, naudojančių hash'inimą, veikimą (pvz., 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; // Refleksiškumas
        if (o == null || getClass() != o.getClass()) return false; // Null ir klasės patikra
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Turinys palyginimas
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Hash generavimas pagal laukus
    }
}