Sobes.tech
Junior

Ką daro equals() metodas Java?

sobes.tech AI

Atsakymas iš AI

Java equals() metodas naudojamas dviejų objektų lygumo patikrinimui. Numatytoji reikšmė, kai objektai paveldi iš Object be perrašymo, lygina nuorodas į objektus (==), tai yra, patikrina, ar kintamieji nurodo į tą pačią atminties vietą.

Tinkamas equals() metodo perrašymas yra svarbus objektų lyginimui pagal jų turinį, o ne pagal jų vietą atmintyje.

Perrašant equals(), reikia laikytis šių taisyklių:

  • Refleksiškumas: bet kuris nulinis x objektas, x.equals(x) turi grąžinti true.
  • Simetrija: bet kurie x ir y ne nuliniai objektai, jei x.equals(y) grąžina true, tada ir y.equals(x) turi grąžinti true.
  • Transityvumas: bet kurie x, y ir z ne nuliniai objektai, jei x.equals(y) ir y.equals(z) abu true, tada ir x.equals(z) turi grąžinti true.
  • Konsistencija: bet kurie x ir y ne nuliniai objektai, daugybiniai x.equals(y) skambučiai turi nuosekliai grąžinti tą patį rezultatą, jei informacija, naudojama palyginimui abiejuose objektuose, nepasikeitė.
  • Null atžvilgiu: bet kuris x ne nulinis objektas, x.equals(null) turi grąžinti false.

Dažnai, perrašant equals(), taip pat būtina perrašyti hashCode() metodą, laikantis kontrakto: jei du objektai yra lygūs pagal equals(), jų hashCode() turi būti vienodi. Atvirkščiai, tai nėra privaloma: jei hashCode() yra vienodi, objektai nebūtinai yra lygūs.

Pavyzdys:

public class MyObject {
    private int value;
    private String name;

    public MyObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // Palyginimas
        if (this == o) return true;
        // Patikrinimas dėl null ir tipo
        if (o == null || getClass() != o.getClass()) return false;
        // Tipas konvertavimas ir palyginimas pagal laukus
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

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

    // getteriai, setteriai ir kt.
}