Java Object.hashCode() - адрес или случайный()?
Я пытаюсь понять встроенную реализацию метода hashCode()
. Что именно возвращает этот метод? Это адрес памяти или это случайное значение?
Ответы
Ответ 1
.hashCode()
Собственная реализация зависит от JVM.
например. HotSpot имеет 6 Object.hashCode()
реализаций. Вы можете выбрать его с помощью флага -XX:hashCode=n
, запускающего JVM через командную строку, где n:
0 - RNG Park-Miller (по умолчанию)
1 - f (адрес, global_statement)
2 - постоянная 1
3 - Последовательный счетчик
4 - Адрес объекта
5 - Потоковая локальная Xorshift
Ответ 2
Из документации:
Насколько разумно практично, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Обычно это выполняется путем преобразования внутреннего адреса объекта в целое число, но этот способ реализации не требуется языком программирования Java TM.)
Таким образом, это может быть связано с адресом памяти, но это необязательно - и вы определенно не должны делать никаких предположений о том, что он связан с памятью вообще.
Ничего, что вы делаете с хеш-кодом, не должно заботиться об этом вообще. Единственное, что вы должны сделать из хеш-кодов:
- Если хэш-коды двух объектов одинаковы, они могут быть равными объектами
- Если хэш-коды двух объектов различаются, они не являются равными объектами (при условии правильной реализации, независимо от того, переопределены или нет)
Ответ 3
Ваш ответ лежит здесь. Как указано в документации:
Насколько разумно практично, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Обычно это выполняется путем преобразования внутреннего адреса объекта в целое число, но этот способ реализации не требуется языком программирования Java TM.)