Sobes.tech
Junior

Kodėl Java reikalingi metodai equals ir hashCode?

sobes.tech AI

Atsakymas iš AI

equals“ ir „hashCode“ metodai Java naudojami teisingam objektų palyginimui ir kolekcijų, pagrįstų maišos lentelėmis (pvz., HashMap, HashSet), darbui.

  • equals(Object o): Nustato, ar dabartinis objektas yra lygus kitam objektui. Pagal numatytuosius nustatymus lygina nuorodas į objektus. Perrašomas, kad palygintų objektų vidinę būseną.

  • hashCode(): Grąžina sveikąjį reikšmę (maišos kodą) objekto. Naudojamas kolekcijų greitam elementų paieškai. Turi būti suderintas su equals: jei du objektai yra lygūs pagal equals, jų maišos kodai turi būti vienodi. Atvirkštinis teiginys neteisingas.

Netinkamas arba nebuvimas šių metodų perrašymo gali sukelti netinkamą elgesį naudojant objektus kolekcijose, pvz., objekto nebuvimą Set po pridėjimo arba nesugebėjimą rasti objekto HashMap pagal raktą.

Pavyzdys, kaip perrašyti:

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; // Nuorodų palyginimas
        if (o == null || getClass() != o.getClass()) return false; // Tipų ir null patikrinimas

        MyObject that = (MyObject) o; // Tipų konvertavimas

        if (id != that.id) return false; // Laukų palyginimas
        return name != null ? name.equals(that.name) : that.name == null;
    }

    @Override
    public int hashCode() {
        int result = id; // Maišos kodo skaičiavimas pagal laukus
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}