Sobes.tech
Junior

Na čo sa používa metóda hashCode?

sobes.tech AI

Odpoveď od AI

Metóda hashCode() v Jave a Kotlin sa používa na generovanie celého čísla, ktoré predstavuje objekt. Zohráva kľúčovú úlohu pri práci s kolekciami založenými na hash tabuľkách (HashMap, HashSet, Hashtable), kde sa používa na rýchle určenie "koša" (bucket), v ktorom by mal byť alebo hľadaný objekt. Kľúčové body:

  • Zabezpečenie kontraktu equals a hashCode: Ak sú dva objekty považované za "rovné" metódou equals(), ich hashCode() by mal vracať rovnakú hodnotu. Opak je nepravdivý: odlišné objekty môžu mať rovnaký hash kód (kolízia).
  • Rýchle vyhľadávanie/vkladanie: Hash kód sa používa ako index pre rýchly prístup k prvkom v hash kolekciách. Bez neho by bolo vyhľadávanie v veľkých kolekciách oveľa pomalšie.
  • Nepovinné: Ak sa objekt neplánuje používať ako kľúč v hash kolekciách, implementácia hashCode() podľa predvoleného (zvyčajne založená na adrese v pamäti) môže byť dostatočná. Avšak, ak sa prepisuje equals(), je potrebné prepísať aj hashCode() na dodržanie kontraktu.
  • Stabilita: Hodnota hashCode() pre nemenný objekt by mala zostať nezmenená počas jeho života. Pre meniteľné objekty sa hash kód môže meniť, ale to si vyžaduje opatrnosť pri používaní v hash kolekciách.

Príklad základnej implementácie v Kotlin:

data class User(val id: Long, val name: String)
// Pre dátové triedy sa `hashCode()` a `equals()` generujú automaticky

Príklad manuálnej implementácie v Jave (dôležité je správne kombinovať hodnoty):

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); // Používame Objects.equals na zabránenie NullPointerException
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name); // Používame Objects.hash na kombinovanie hash kódov
    }
}