Встречается на 2% собеседований по Java

Когда может произойти потеря значения при иммутабельном ключе в HashMap

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

Пример:

java
public final class Key {
    private final int id;

    public Key(int id) { this.id = id; }
    @Override public int hashCode() { return id; }
    // геттеры, equals...
}

Key key = new Key(1);
Map<Key, String> map = new HashMap<>();
map.put(key, "value");

// Изменение поля через рефлексию (нарушение иммутабельности!)
Field field = key.getClass().getDeclaredField("id");
field.setAccessible(true);
field.set(key, 2); // меняем id, влияющий на hashCode

System.out.println(map.get(key)); // null - потеря значения!

Решение: всегда делать ключи полностью иммутабельными (без сеттеров, final поля) и не нарушать инкапсуляцию.

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы