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:
equalsjahashCodelepingu tagamine: Kui kaks objekti peetakseequals()meetodi järgi "võrdseteks", peab nendehashCode()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 kuiequals()üle kirjutatakse, tuleb kahashCode()ü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
}
}