Sobes.tech
Junior

Mida teeb meetod equals() Java-s?

sobes.tech AI

Vastus AI-lt

Java equals() meetod kasutatakse kahe objekti võrdlemiseks nende võrdsuse kontrollimiseks. Vaikimisi, juhul kui objektid pärivad Object-ist ilma selle ülekirjutamiseta, võrdleb ta viiteid objektidele (==), see tähendab, kontrollib, kas muutujad osutavad samale mälupunktile.

Õige equals() meetodi ülekirjutamine on oluline, et võrrelda objekte nende sisu järgi, mitte nende asukoha järgi mälus.

equals()-i ülekirjutamisel tuleb järgida järgmisi reegleid:

  • Refleksiivsus: iga mitte-null x objekti puhul, x.equals(x) peab tagastama true.
  • Sümbioos: iga mitte-null x ja y objekti puhul, kui x.equals(y) tagastab true, siis peab ka y.equals(x) tagastama true.
  • Transitiivsus: iga mitte-null x, y ja z objekti puhul, kui x.equals(y) ja y.equals(z) mõlemad on true, siis peab ka x.equals(z) olema true.
  • Konsistents: iga mitte-null x ja y objekti puhul, korduvad x.equals(y) kõned peavad stabiilselt tagastama sama tulemuse, kui teave, mida kasutatakse võrdlemiseks, ei ole muutunud.
  • Nulli suhtes: iga mitte-null x objekti puhul, x.equals(null) peab tagastama false.

Tavaliselt, equals()-i ülekirjutamisel on vaja ka ülekirjutada hashCode() meetod, järgides kontakti: kui kaks objekti on võrdsed equals()-i järgi, siis nende hashCode() väärtused peavad olema samad. Vastupidine ei ole kohustuslik: kui hashCode() väärtused on samad, ei tähenda see tingimata, et objektid on võrdsed.

Näide equals()-i ülekirjutamisest:

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) {
        // Võrdlus
        if (this == o) return true;
        // Null ja klassi kontroll
        if (o == null || getClass() != o.getClass()) return false;
        // Tüübi konverteerimine ja väljade võrdlemine
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

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

    // getterid, setterid jms
}