Sobes.tech
Middle

Va funcționa HashMap dacă toate cheile adăugate au același hashCode()?

sobes.tech AI

Răspuns de la AI

Da, va fi.

Cu un hashCode() identic, toate elementele vor ajunge în aceeași "coș" (bucket) în HashMap. Acest lucru va duce la degradarea HashMap-ului într-o listă legată (sau un copac, dacă există suficiente elemente și se folosește Java 8+ cu TreeNode), ceea ce va deteriora semnificativ performanța operațiilor put(), get(), remove() până la O(n) în loc de O(1) în medie.

Prin urmare, HashMap va funcționa corect, dar își va pierde principalul avantaj în viteză din cauza coliziunilor de hash. Pentru diferențierea obiectelor cu același hash, se folosește metoda equals().

class BadHashKey {
    private String name;

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

    @Override
    public int hashCode() {
        return 1; // Returnează întotdeauna același cod hash
    }

    @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); // Verifică egalitatea după nume
    }

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

// Exemplu de utilizare
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Ambele chei vor fi în același coș
// String value = map.get(new BadHashKey("key1")); // Căutarea va fi lentă