Junior — Middle
Lze použít pole bajtů jako klíč v datové struktuře HashMap, a jaké jsou s tím spojené vlastnosti?
sobes.tech AI
Odpověď od 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"
Таким образом, без обёртки массивы нельзя использовать как ключи по содержимому.