Sobes.tech
Назад к вопросам
Junior — Middle
65

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

Компании, где спрашивали
Effective Technologies

Ответ от нейросети

sobes.tech AI

В Java и Kotlin можно использовать массив байтов (ByteArray) в качестве ключа в HashMap, но есть важные особенности:

  • Массивы в JVM не переопределяют методы equals() и hashCode() от Any, поэтому сравнение происходит по ссылке, а не по содержимому.
  • Это значит, что два разных массива с одинаковым содержимым будут считаться разными ключами.

Чтобы использовать массив байтов как ключ по содержимому, нужно:

  • Использовать обёртку, которая переопределяет equals() и hashCode(), например, ByteBuffer или собственный класс.
  • Либо использовать коллекции, которые сравнивают содержимое, например, List<Byte>.

Пример обёртки:

class ByteArrayWrapper(val data: ByteArray) {
    override fun equals(other: Any?) =
        other is ByteArrayWrapper && data.contentEquals(other.data)

    override fun hashCode() = data.contentHashCode()
}

val map = HashMap<ByteArrayWrapper, String>()
val key1 = ByteArrayWrapper(byteArrayOf(1, 2, 3))
val key2 = ByteArrayWrapper(byteArrayOf(1, 2, 3))

map[key1] = "value"
println(map[key2]) // выведет "value"

Таким образом, без обёртки массивы нельзя использовать как ключи по содержимому.