Sobes.tech
Junior

Miért szükségesek az equals és hashCode metódusok Java-ban?

sobes.tech MI

Válasz az MI-től

A Java equals és hashCode metódusokat az objektumok helyes összehasonlítására és hash-alapú kollekciókkal (például HashMap, HashSet) való munkára használják.

  • equals(Object o): Meghatározza, hogy a jelenlegi objektum egyenértékű-e egy másik objektummal. Alapértelmezés szerint az objektumokra mutató hivatkozásokat hasonlítja össze. Felülírható az objektumok belső állapotának összehasonlítására.

  • hashCode(): Visszaad egy egész számot (hash-kódot) az objektumról. Gyors kereséshez használják a kollekciók. Meg kell egyeznie az equals-szel: ha két objektum egyenlő az equals szerint, akkor a hash-kódjuknak is egyeznie kell. A fordított állítás nem igaz.

Helytelen vagy hiányzó felülírásuk a kollekciókban való használat során hibás viselkedést eredményezhet, például az, hogy egy objektum nem található a Set-ben a hozzáadás után, vagy nem lehet megtalálni egy objektumot a HashMap-ben kulcs szerint.

Felülírás példája:

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

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // Hivatkozások összehasonlítása
        if (o == null || getClass() != o.getClass()) return false; // Típus és null ellenőrzés

        MyObject that = (MyObject) o; // Átkonvertálás

        if (id != that.id) return false; // Mezők összehasonlítása
        return name != null ? name.equals(that.name) : that.name == null;
    }

    @Override
    public int hashCode() {
        int result = id; // Hash-kód számítása mezők alapján
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}