Насколько я понимаю, два неравных объекта могут иметь один и тот же хэш-код. Как это будет обрабатываться при добавлении или извлечении из java-файла HashMap?Что произойдет, если два разных объекта имеют один и тот же хэш-код?
ответ
Они будут добавлены в одно и то же ведро, и equals()
будет использоваться для их различения. Каждое ведро может содержать список объектов с одинаковым хеш-кодом.
Теоретически вы можете вернуть то же целое число, что и хэш-код для любого объекта данного класса, но это будет означать, что вы потеряете все преимущества производительности хэш-карты и, по сути, сохраните объекты в списке.
Не является ли дополнительный хэш, применяемый по умолчанию для Hashmap, чтобы это не происходило, что вводит некоторый дистрибутив? – Ajay
Дополнительная информация о производительности. В java8, когда у нас слишком много неравных ключей, которые дают один и тот же хэш-код (индекс) - тогда количество элементов в хэш-ведре растет выше определенного порога (TREEIFY_THRESHOLD = 8), содержимое этого ковша переключается с использования связанный список объектов Entry для сбалансированного дерева. Это теоретически улучшает производительность наихудшего случая от O (n) до O (log n). –
В HashMap ключи вместе со своими ассоциативными значениями хранятся в узле связанного списка в ведре, а ключи по существу сравниваются в hashmap, используя метод equals(), а не по hashcode.
hm.put("a","aValue"); // Suppose hashcode created for key "a" is 209
hm.put("b","bValue"); // Here hashcode created for key "b" is 209 as well.
- Если
a.equals(b)
возвращаетtrue
,bValue
заменитaValue
иbValue
будут возвращены. - Если
a.equals(b)
возвращаетfalse
другой узел будет создан в списке ведра, так что, когда вы звонитеget("b")
вы получитеbValue
такa.equals(b)
являетсяfalse
.
Как я могу получить значение if if hashcode? Это даст мне bValue, но я хочу aValue. Это возможно ? – Sanket
В этом случае вы можете использовать IdentityHashMap, где разные объекты с одинаковым хешем считаются разными в зависимости от их идентификаторов.
Если два неравных объекта имеют одно и то же значение хэша, это вызывает столкновение в хеш-таблице, поскольку оба объекта хотят находиться в одном слоте (иногда называемом ведром). Алгоритм хэша должен разрешать такие столкновения. Возвращаясь к исчезающим воспоминаниям о курсах алгоритмов моего колледжа, я помню три основных способа сделать это:
- Посмотрите на следующий пустой слот в хеш-таблице и поместите туда объект. Плюсы: легко реализовать, минусы: может привести к кластеризации объектов и ухудшить производительность, емкость может быть превышена
- Есть дополнительная функция хэша для использования, когда есть конфликт: Плюсы: обычно быстрая, минусы: необходимо написать вторую хеш-функцию и могут по-прежнему возникать столкновения, а емкость может быть превышена
- Сделать связанный список объектов из конфликтного слота хеш-таблицы. Плюсы/минусы: обычно быстрые для достойной хеш-функции и коэффициенты нагрузки, но могут ухудшаться до линейного поиска в худшем случае.
Я думаю, что классы хэша Java используют третий метод, но они могут использовать комбинированный подход. Ключ к хорошему хэшированию заключается в том, чтобы убедиться, что хеш-таблица имеет достаточно большую емкость и писать хорошие хэш-функции. Хэш-таблица, в которой есть только столько ведер, что объекты, которые она удерживает, вероятно, будет иметь конфликты. Обычно вы хотите, чтобы хэш-таблица была примерно в два раза больше, чем количество объектов, которые она хранит. Java HashMap будет расти по мере необходимости, но вы можете дать ему начальную емкость и коэффициент загрузки, если хотите.
Хеш-функция до программиста. Вы можете просто вернуть 0 для всех объектов, но это будет означать, что хеширование (как хранилище, так и извлечение) станет O (n) вместо O (1) ... или в несрочных терминах, это будет медленным.
Ссылка: http://www.coderanch.com/t/540275/java/java/objects-hashcode-HashMap-retrieve-objects
HashMap работает над концепцией хэширования и индексации. Внутренне HashMap сохраняет значения в массиве узлов. Каждый узел ведет себя как LinkedList.
Каждый узел связанного списка имеют 4 значения:
int hash
K key
V value
Node<K, V> next
HashMap Внутренняя структура:
При вводе значения в HashMap генерируется первый хэш-код ключа и на основе некоторого алгоритма вычисляется индекс.
Таким образом, наше значение будет храниться в определенном индексе с помощью hashcode, key, value и address следующего элемента.
При извлечении значения из HashMap первый хэш-код будет генерировать и затем индексировать (так же, как и во время вставки). Получая значение из индекса, сначала он проверяет hashcode, если hashcode будет соответствовать, тогда только он будет проверять ключ от Node, используя метод equals. Если ключ будет соответствовать, то он вернет это значение, иначе он будет проверять следующий узел с тем же хэш-кодом.
- 1. Если два значения имеют один и тот же адрес
- 2. Nunit: Убедитесь, что два объекта один и тот же
- 3. Как проверить, что два связанных объекта имеют один и тот же родительский объект?
- 4. Что произойдет, если я использую один и тот же идентификатор для нескольких виджетов в разных макетах?
- 5. Что произойдет, если два Git совершают один и тот же SHA-1 хэш?
- 6. Два DispatcherServlets имеют один и тот же ApplicationContext
- 7. Что лучше, если два подкласса имеют один и тот же метод?
- 8. Что произойдет, если два пространства имен имеют одинаковое имя переменной?
- 9. Что произойдет, если один и тот же файл будет прочитан и добавлен одновременно (программирование на питоне)?
- 10. Объедините данные, если они имеют один и тот же хост
- 11. ControlTemplates имеют один и тот же цвет
- 12. Почему один и тот же оператор печатает два разных значения?
- 13. два объекта php ссылаются на один и тот же экземпляр
- 14. emacsclient не позволит два разных кадров имеют один и тот же файл открыт
- 15. Что произойдет, если я дважды сгенерировал один и тот же RDD в Spark
- 16. Что произойдет, если две категории ObjC переопределяют один и тот же метод?
- 17. Стратегия наследования доктрины, когда два разных подкласса расширяют один и тот же экземпляр объекта
- 18. испытаний, если два элемента один и тот же
- 19. Объединить два объекта, которые, как я знаю, имеют один и тот же IEnumerable <> type
- 20. Как выполнить один и тот же код для разных событий
- 21. Что произойдет, если два разных сеанса активны в одном браузере?
- 22. Возможно ли, что два имени хоста имеют один и тот же IP-адрес?
- 23. Что произойдет, если мы сможем объединить один и тот же набор изменений несколько раз? - TFS
- 24. Что произойдет, если несколько пакетов переписывают один и тот же контроллер в symfony?
- 25. Что произойдет, если вы используете один и тот же «versionCode» для нескольких выпусков приложений?
- 26. Что произойдет, если вы перегрузите один и тот же маршрут с помощью экспресс js?
- 27. Тот же шаблон URL, два разных вида?
- 28. Как сказать два исключения .NET, если они имеют один и тот же тип?
- 29. Тот же набор данных, два разных JTables
- 30. Что происходит, если два интерфейса содержат один и тот же метод по умолчанию?
BTW: Вы можете создать много длинных значений с помощью одного и того же хеш-кода, чтобы попробовать это. 'new Long (n * 0x100000001L)' все имеют hashCode 0 для 'n> = 0' –