Sobes.tech
Back to questions
Junior — Middle
72

Как поведет себя HashMap при добавлении элемента с null значением, если метод hashCode всегда возвращает одинаковое число?

Companies where asked
Ifellow

Answer from AI

sobes.tech AI

Если в 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 корректно работает с такими ключами, но эффективность снижается из-за коллизий.