Можно ли использовать data class с изменяемым полем в качестве ключа в HashMap

«Можно ли использовать data class с изменяемым полем в качестве ключа в HashMap» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использовать data class с изменяемым полем в качестве ключа HashMap не рекомендуется, но технически возможно. Проблема в том, что hashCode() и equals() зависят от значений полей. Если изменить поле после добавления в HashMap, ключ потеряется.

data class Key(var id: Int)

fun main() {
    val map = HashMap<Key, String>()
    val key = Key(1)
    map[key] = "Value"
    key.id = 2 // Изменяем поле
    println(map[key]) // null - ключ "потерялся"
}

Решение:

  1. Сделать поля val (неизменяемыми)
  2. Использовать неизменяемые структуры (например, Pair, Triple)
  3. Переопределить hashCode()/equals(), но это усложнит код и может привести к ошибкам.

Лучше избегать изменяемых ключей в HashMap.