Sobes.tech
Junior

Milleks kasutatakse meetodit hashCode?

sobes.tech AI

Vastus AI-lt

Java ja Kotlin hashCode() meetodit kasutatakse objekti esindamiseks täisarvuna. See mängib võtmerolli kogumikes, mis põhinevad hash-tabelitel (HashMap, HashSet, Hashtable), kus seda kasutatakse objekti "ämbrisse" (bucket) kiireks määramiseks või otsimiseks. Peamised punktid:

  • equals ja hashCode lepingu tagamine: Kui kaks objekti peetakse equals() meetodi järgi "võrdseteks", peab nende hashCode() tagastama sama väärtuse. Vastupidine ei kehti: erinevatel objektidel võib olla sama hash-kood (kolleksioon).
  • Kiire otsing/paigutus: Hash-koodit kasutatakse indeksina kiireks juurdepääsuks hash-kogumikele. Ilma selleta oleks otsing suurtes kogumikes palju aeglasem.
  • Vajalik mitte: Kui objekti ei plaanita kasutada võtmena hash-kogumikes, võib vaikimisi hashCode() (tavaliselt mäluaadressil põhinev) olla piisav. Kuid kui equals() üle kirjutatakse, tuleb ka hashCode() üle kirjutada vastavalt lepingule.
  • Stabiilsus: Muutumatul objektil peaks hashCode() väärtus jääma kogu selle eluea jooksul muutumatuks. Muutuvatel objektidel võib hash-kood muutuda, kuid see nõuab ettevaatust.

Näide põhiteostusest Kotlinis:

data class User(val id: Long, val name: String)
// Andmetüübi `hashCode()` ja `equals()` genereeritakse automaatselt

Näide käsitsi teostusest Java:

class User {
    private final long id;
    private final String name;

    public User(long id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
               Objects.equals(name, user.name); // Kasutame Objects.equals, et vältida NullPointerException
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name); // Kasutame Objects.hash, et kombineerida hash-koodid
    }
}