Sobes.tech
Junior

Miks on Java-s vajalikud meetodid equals ja hashCode?

sobes.tech AI

Vastus AI-lt

Java equals ja hashCode meetodid kasutatakse objektide õige võrdlemise ja hash-põhiste kogude (näiteks HashMap, HashSet) tööks.

  • equals(Object o): Määrab, kas käesolev objekt on võrdne teise objektiga. Vaikimisi võrdleb viiteid objektidele. Üle kirjutatakse, et võrrelda objektide sisemist olekut.

  • hashCode(): Tagastab objekti täisarvulise väärtuse (hash-koodi). Kasutatakse kogudes kiireks elementide otsimiseks. Peab olema kooskõlas equals-ga: kui kaks objekti on equals-iga võrdsed, peavad nende hash-koodid olema samad. Vastupidine väide ei kehti.

Vale või puuduv nende meetodite üle kirjutamine võib põhjustada ebaõiget käitumist kogudes, näiteks objekti puudumist Set-is pärast lisamist või võimetust leida objekti HashMap-ist võtme järgi.

Näide üle kirjutamisest:

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; // Viidete võrdlus
        if (o == null || getClass() != o.getClass()) return false; // Tüüpide ja null kontroll

        MyObject that = (MyObject) o; // Tüüpide konverteerimine

        if (id != that.id) return false; // Väli võrdlus
        return name != null ? name.equals(that.name) : that.name == null;
    }

    @Override
    public int hashCode() {
        int result = id; // Hash-koodi arvutamine väljade põhjal
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}