Sobes.tech
Middle

Fog működni a HashMap, ha az összes hozzáadott kulcs ugyanazt a hashCode() értéket kapja?

sobes.tech MI

Válasz az MI-től

Igen, lesz.

Ugyanazzal a hashCode()-szal, minden elem ugyanabba a "kádba" (bucket) kerül a HashMap-ben. Ez ahhoz vezet, hogy a HashMap egy láncolt listává (vagy fává, ha elég sok elem van, és Java 8+ TreeNode-t használ) alakul, ami jelentősen rontja a put(), get(), remove() műveletek teljesítményét átlagosan O(n)-re, ahelyett, hogy O(1) lenne.

Így a HashMap helyesen fog működni, de elveszíti fő előnyét a gyorsaságban a hash ütközések miatt. Az azonos hash-sel rendelkező objektumokat az equals() metódus segítségével különböztetjük meg.

class BadHashKey {
    private String name;

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

    @Override
    public int hashCode() {
        return 1; // Mindig ugyanazt a hash kódot adja vissza
    }

    @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); // Ellenőrzi az egyenlőséget név szerint
    }

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

// Példa használatra
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Mindkét kulcs ugyanabba a kádba kerül
// String value = map.get(new BadHashKey("key1")); // A keresés lassú lesz