Sobes.tech
Middle

bude HashMap fungovať, ak všetky pridávané kľúče majú rovnaký hashCode()?

sobes.tech AI

Odpoveď od AI

Áno, bude.

Pri rovnakom hashCode() budú všetky prvky padať do toho istého "kbelíka" (bucket) v HashMap. To povedie k degradácii HashMap na prepojený zoznam (alebo strom, ak je dostatok prvkov a používa sa Java 8+ s TreeNode), čo výrazne zhorší výkon operácií put(), get(), remove() na priemernú hodnotu O(n) namiesto O(1).

Takže HashMap bude správne fungovať, ale stratí svoju hlavnú výhodu v rýchlosti kvôli kolíziám hashov. Na rozlíšenie objektov s rovnakým hashom sa používa metóda equals().

class BadHashKey {
    private String name;

    public BadHashKey(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return 1; // Vždy vracia rovnaký hash kód
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BadHashKey that = (BadHashKey) o;
        return name.equals(that.name); // Kontrola rovnosti podľa mena
    }

    @Override
    public String toString() {
        return "BadHashKey{" +
               "name='" + name + '\'' +
               '}';
    }
}

// Príklad použitia
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Oba kľúče budú v rovnakom "kbelíku"
// String value = map.get(new BadHashKey("key1")); // Vyhľadávanie bude pomalé