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

Можно ли переопределить hashCode иммутабельного класса, чтобы использовать его как ключ в HashMap

Да, можно. При переопределении hashCode() для иммутабельного класса важно соблюдать контракт:

  1. Если equals() возвращает true, hashCode() должен возвращать одинаковое значение.
  2. Если equals() возвращает false, hashCode() желательно должен возвращать разные значения (но не обязательно).

Пример:

java
public final class ImmutableKey {
    private final String id;
    private final int version;
text
public ImmutableKey(String id, int version) {
    this.id = id;
    this.version = version;
}

@Override
public int hashCode() {
    return 31 * id.hashCode() + version;
}

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

}

text

Использование в HashMap:
```java
Map<ImmutableKey, String> map = new HashMap<>();
map.put(new ImmutableKey("A", 1), "Value");

Иммутабельность ключа гарантирует, что его hashCode не изменится после добавления в HashMap, что критично для корректной работы.

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

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

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

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