Gymterview
middle

Почему нельзя использовать byte[] в качестве ключа в HashMap

Массив byte[] не переопределяет методы hashCode() и equals() — используются стандартные реализации из Object, основанные на идентичности объекта (ссылке), а не на содержимом.

Это означает:

  • hashCode() возвращает значение, зависящее от адреса объекта в памяти (через System.identityHashCode()), а не от содержимого массива.
  • equals() сравнивает ссылки (==), а не элементы массива.

Поэтому два массива с одинаковым содержимым ({1, 2, 3}) будут иметь разные hashCode и equals() вернет false. Элемент, сохраненный с одним массивом-ключом, невозможно найти, используя другой массив с теми же элементами — доступ возможен только по той же самой ссылке.

Для использования массива байт как ключа его можно обернуть в ByteBuffer.wrap(bytes) или String — эти классы корректно реализуют hashCode и equals на основе содержимого.

На собеседовании: ключевая мысль — массивы наследуют hashCode/equals от Object, которые работают по ссылке. Предложите альтернативы: ByteBuffer.wrap() или String.