Назад к вопросам
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"
Таким образом, без обёртки массивы нельзя использовать как ключи по содержимому.