В JVM HotSpot по умолчанию при первом вызове не перегруженного Object.hashCode
или System.identityHashCode
случайное число генерируется и сохраняется в заголовке объекта. Последующие вызовы Object.hashCode
или System.identityHashCode
просто извлекают это значение из заголовка. По умолчанию он не имеет ничего общего с содержимым объекта или местоположением объекта, только случайное число. Это поведение контролируется опцией -XX:hashCode=n
HotSpot JVM, которая имеет следующие возможные значения:
- 0: использовать глобальный генератор случайных чисел. Это настройка по умолчанию в Java 7. Недостатком является то, что одновременные вызовы из нескольких потоков могут вызвать состояние гонки, что приведет к генерации одного и того же hashCode для разных объектов. Также в высококонкурентной среде возможны задержки из-за конкуренции (при использовании одной и той же области памяти от разных ядер ЦП).
- 5: использовать некоторый локальный для потока генератор случайных сдвигов xor, который свободен от предыдущих недостатков. Это настройка по умолчанию в Java 8.
- 1: использовать указатель объекта, смешанный с некоторым случайным значением, которое изменяется в событиях «остановка мира», поэтому между событиями «остановка мира» (такими как сборка мусора) сгенерированные хэш-коды стабильны (для целей тестирования / отладки )
- 2: всегда использовать
1
(для целей тестирования / отладки)
- 3: использовать автоинкрементные числа (для целей тестирования / отладки также используется глобальный счетчик, поэтому возможны состязания и условия гонки)
- 4: при необходимости использовать указатель объекта, обрезанный до 32 бит (для целей тестирования / отладки)
Обратите внимание, что даже если вы установите -XX:hashCode=4
, hashCode не всегда будет указывать на адрес объекта. Объект может быть перемещен позже, но hashCode останется прежним. Также адреса объектов плохо распределены (если ваше приложение использует не так много памяти, большинство объектов будет располагаться близко друг к другу), поэтому вы можете получить несбалансированные хеш-таблицы, если будете использовать эту опцию.