Sobes.tech
Junior — Middle

Welke gevolgen hebben het gebruik van een wijzigbaar object als sleutel in een collectie en het wijzigen van de eigenschappen ervan?

sobes.tech AI

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