Sobes.tech
Junior

Ką daro equals() metodas Java?

sobes.tech AI

Atsakymas iš AI

Java equals() metodas naudojamas dviejų objektų turinio palyginimui. Pagal numatytuosius nustatymus, Object klasėje jis lygina nuorodas į objektus, tai yra, nustato, ar dvi kintamosios nurodo į tą patį atminties objektą:

Tačiau dauguma Java klasių (pavyzdžiui, String, Integer) perrašinėja šį metodą, kad palygintų objektuose esančias reikšmes, o ne jų nuorodas:

Perrašant equals() svarbu laikytis jo kontrakto:

  • Refleksyvumas: x.equals(x) turi būti true bet kokiam ne-null x.
  • Simetrija: x.equals(y) turi būti true tik tada, kai y.equals(x) yra true, bet kokiam ne-null x ir y.
  • Transityvumas: Jei x.equals(y) ir y.equals(z) yra true, tada x.equals(z) taip pat turi būti true bet kokiam ne-null x, y ir z.
  • Konsistencija: Daugybiniai x.equals(y) iškvietimai turi grąžinti tą patį rezultatą, jei objektai nepasikeitė.
  • **Bet koks ne-null x, x.equals(null) turi būti false.

Pavyzdys, kaip perrašyti equals():

class MyObject {
    private int value;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyObject myObject = (MyObject) obj;
        return value == myObject.value;
    }
}

Naudojimas equals():

// Nuorodų palyginimas (numatytasis `Object`)
Object obj1 = new Object();
Object obj2 = new Object();
boolean byReference = obj1.equals(obj2); // false

// Reikšmių palyginimas (perrašius `equals()`)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean byValue = myObj1.equals(myObj2); // true

Taip pat svarbu perrašyti hashCode() metodą kartu su equals(), kad būtų išsaugotas jų kontraktas ir išvengta problemų naudojant kolekcijas, kurios naudoja maišus (pvz., HashMap, HashSet).