Sobes.tech
Junior

Mit csinál az equals() metódus Java-ban?

sobes.tech MI

Válasz az MI-től

A equals() metódus Java-ban két objektum egyenlőségének összehasonlítására szolgál. Alapértelmezés szerint, az Object-ből örökölt, felül nem írt objektumok esetén, az referenciákat (==) hasonlít össze, vagyis ellenőrzi, hogy a változók ugyanarra a memóriahelyre mutatnak-e.

A equals() metódus helyes felülírása fontos az objektumok tartalmuk szerint történő összehasonlításához, nem a memóriahelyük szerint.

A equals() felülírásakor az alábbi szabályokat kell követni:

  • Reflexivitás: minden nem null objektum x esetén, az x.equals(x) értéke true legyen.
  • Szimmetria: minden nem null objektum x és y esetén, ha x.equals(y) true, akkor y.equals(x) is true legyen.
  • Transzitivitás: minden nem null objektum x, y és z esetén, ha x.equals(y) és y.equals(z) true, akkor x.equals(z) is true legyen.
  • Konzisztencia: minden nem null objektum x és y esetén, a x.equals(y) többszöri hívása ugyanazt az eredményt adja, amennyiben a összehasonlásban használt adatok nem változtak.
  • Minden nem null objektum x esetén, az x.equals(null) értéke false legyen.

Általában, a equals() felülírásakor, a hashCode() metódust is felül kell írni, betartva a szerződést: ha két objektum egyenlő a equals() szerint, akkor a hashCode() által visszaadott kódoknak egyezniük kell. A fordított nem kötelező: ha a hash kódok egyeznek, az objektumok nem feltétlenül egyenlőek.

Példa a felülírásra:

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) {
        // Összehasonlítás
        if (this == o) return true;
        // null és típus ellenőrzése
        if (o == null || getClass() != o.getClass()) return false;
        // Típuskonverzió és mezők szerinti összehasonlítás
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Hash kód generálása mezők alapján
        return Objects.hash(value, name);
    }

    // getterek, setterek stb.
}