Sobes.tech
Junior — Middle

¿Qué consecuencias surgen si se utiliza un objeto mutable como clave en una colección y, al mismo tiempo, se cambian sus propiedades?

sobes.tech AI

Respuesta de la IA

Если использовать изменяемый объект в качестве ключа в коллекции, например, в 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, поиск по ключу не сработает.