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, поиск по ключу не сработает.