Ответ 1
Поскольку хэш-код по умолчанию для объекта не обязательно должен быть уникальным, возврат всего адреса не требуется. Реализация может захватить группу битов из адреса - скажем, биты с 3 по 35 в 64-битной системе или XOR между верхними 32 битами и младшими 32 битами или просто нижние 32 бита.
Но так как многие объекты будут иметь аналогичные адреса [из-за сборки мусора], это будет плохой выбор для хэш-кода.
Хэш-коды, которые численно близки друг к другу, в порядке. Даже небольшое количество идентичных хэш-кодов не создавало бы проблемы, потому что для решения любых связей используется равенство. Ситуации, когда используется реализация хеш-кода по умолчанию, обычно ограничены, поскольку ожидается, что объекты, которые используются в качестве ключей в контейнерах на основе хэша, обеспечивают "хорошие" реализации метода hashCode
.
Oracle говорит, что по умолчанию реализация их JVM использует внутренний адрес объекта, что бы это ни значило, для вычисления его hashCode
. Однако другим реализациям JVM не требуется делать то же самое:
Вот кавычки из документации Oracle:
Насколько это разумно практично, метод
hashCode
, определенный классомObject
, возвращает разные целые числа для разных объектов. (Обычно это выполняется путем преобразования внутреннего адреса объекта в целое число, но этот способ реализации не требуется языком программирования Java ™.)
Здесь вы можете найти фактическую реализацию алгоритма здесь. Найдите функцию get_next_hash
для получения подробной информации. Похоже, что вычисление хэша на основе адреса выполняется с простым преобразованием:
value = intptr_t(obj) ;