Sobes.tech
Junior — Middle
81

Какие последствия возникают, если использовать изменяемый объект в качестве ключа в коллекции и при этом менять его свойства?

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

Если использовать изменяемый объект в качестве ключа в коллекции, например, в HashMap, и при этом изменить свойства этого объекта, влияющие на методы hashCode() или equals(), то это приведет к нарушению целостности коллекции. Ключ может стать «невидимым» для поиска, так как хэш-код изменится, и объект не будет найден в той же корзине хэш-таблицы.

Например, если ключ изменился после помещения в HashMap, вызов map.get(key) может вернуть null, даже если ключ присутствует. Это происходит потому, что хэш-код объекта не совпадает с первоначальным, и поиск не находит нужную ячейку.

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

class Key {
    private int id;
    private String name;

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Key)) return false;
        Key key = (Key) o;
        return id == key.id && Objects.equals(name, key.name);
    }

    // Геттеры и сеттеры
}

// Если изменить id или name после добавления в HashMap, поиск по ключу не сработает.