При использовании byte[]
в качестве ключа в HashMap
, стандартные реализации методов hashCode()
и equals()
у массива (Object.hashCode()
и Object.equals()
) сравнивают ссылки на объекты, а не их содержимое.
Object.hashCode()
возвращает хеш-код, основанный на адресе в памяти. Два массива с одинаковым содержимым, но расположенные в разных местах памяти, будут иметь разные хеш-коды.Object.equals(Object obj)
возвращает true
только если сравниваемые ссылки указывают на один и тот же объект массива. Два разных объекта byte[]
с одинаковым содержимым будут считаться неравными.Следовательно, если вы поместите массив байтов в HashMap
как ключ, а затем попытаетесь получить значение, используя другой массив байтов с тем же содержимым, HashMap
не сможет найти соответствующую запись, потому что хеш-коды будут отличаться и equals
вернет false
.
Для использования содержимого массива байтов в качестве ключа требуется пользовательская реализация, которая корректно вычисляет хеш-код и сравнивает массивы по их содержимому. Например, можно обернуть byte[]
в класс с переопределенными hashCode()
и equals()
, или использовать существующие классы, такие как ByteBuffer.wrap()
или адаптеры из библиотек вроде Apache Commons ByteArrayUtils.hashCode()
и Arrays.equals()
.
Пример проблемного поведения:
java
При использовании byte[]
в качестве ключа в HashMap
, стандартные реализации методов hashCode()
и equals()
у массива (Object.hashCode()
и Object.equals()
) сравнивают ссылки на объекты, а не их содержимое.
Object.hashCode()
возвращает хеш-код, основанный на адресе в памяти. Два массива с одинаковым содержимым, но расположенные в разных местах памяти, будут иметь разные хеш-коды.Object.equals(Object obj)
возвращает true
только если сравниваемые ссылки указывают на один и тот же объект массива. Два разных объекта byte[]
с одинаковым содержимым будут считаться неравными.Следовательно, если вы поместите массив байтов в HashMap
как ключ, а затем попытаетесь получить значение, используя другой массив байтов с тем же содержимым, HashMap
не сможет найти соответствующую запись, потому что хеш-коды будут отличаться и equals
вернет false
.
Для использования содержимого массива байтов в качестве ключа требуется пользовательская реализация, которая корректно вычисляет хеш-код и сравнивает массивы по их содержимому. Например, можно обернуть byte[]
в класс с переопределенными hashCode()
и equals()
, или использовать существующие классы, такие как ByteBuffer.wrap()
или адаптеры из библиотек вроде Apache Commons ByteArrayUtils.hashCode()
и Arrays.equals()
.
Пример проблемного поведения:
java
Register or sign in to get access to full answers for all questions from the question bank.