Sobes.tech
Junior — Middle
123

Kako će se HashMap ponašati pri dodavanju elementa sa null vrednošću, ako metoda hashCode uvek vraća isti broj?

Компаније где су питане
Ifellow

Одговор од АИ

sobes.tech АИ

Если в Java HashMap добавить элемент с ключом, у которого метод hashCode() всегда возвращает одно и то же число, то все такие ключи будут попадать в один и тот же бакет (корзину) внутренней структуры HashMap.

При добавлении элемента с null значением (то есть значение может быть null, ключ — не обязательно), HashMap нормально это обработает, так как значения могут быть null. Ключ же с одинаковым hashCode будет помещён в одну корзину, и при коллизиях HashMap сравнивает ключи методом equals().

Если у всех ключей одинаковый hashCode(), то производительность операций вставки и поиска будет деградировать до линейной, так как все элементы окажутся в одном списке или дереве внутри одной корзины.

Пример:

class Key {
    private String id;

    public Key(String id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        return 42; // всегда одно и то же число
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Key other = (Key) obj;
        return id.equals(other.id);
    }
}

HashMap<Key, String> map = new HashMap<>();
map.put(new Key("a"), null); // значение null допустимо
map.put(new Key("b"), "value");

// Все ключи с hashCode=42 попадут в одну корзину, что ухудшит производительность.

Таким образом, HashMap корректно работает с такими ключами, но эффективность снижается из-за коллизий.