Sobes.tech
Middle

Ще работи ли HashMap, ако всички добавяни ключове имат еднакъв hashCode();

sobes.tech AI

Отговор от AI

Да, ще бъде.

При еднакъв hashCode() всички елементи ще попаднат в една и съща "кошница" (bucket) в HashMap. Това ще доведе до деградация на HashMap до свързан списък (или дърво, ако има достатъчно елементи и се използва Java 8+ с TreeNode), което значително ще влоши производителността на операциите put(), get(), remove() до O(n) вместо O(1) средно.

Така HashMap ще функционира правилно, но ще загуби основното си предимство по скорост поради колизии на хешове. За разграничаване на обекти с еднакъв хеш се използва методът equals().

class BadHashKey {
    private String name;

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

    @Override
    public int hashCode() {
        return 1; // Винаги връща един и същ хеш код
    }

    @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); // Проверка за равенство по име
    }

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

// Пример за използване
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // И двата ключа ще са в една и съща "кошница"
// String value = map.get(new BadHashKey("key1")); // Търсенето ще е бавно