Предположим, что System.identityHashCode(object1)==123
и object1
являются сборщиком мусора. Возможно ли, что вновь созданный object2
может иметь тот же код идентификатора, что и object1
, полученный до того, как он был GC'ed?
System.identityHashCode() может возвращать один и тот же hashCode после того, как объект GC'ed
Ответы (2)
Возможно ли, что новый созданный объект2 может иметь тот же код идентификатора, что и объект1, полученный до того, как он был GC'ed?
Да, это так.
Хэш-код идентификации (обычно) получается из адреса объекта, когда метод вызывается для объекта впервые. Если GC перемещает object1
после вычисления хэш-кода, новый объект (object2
) может быть выделен по адресу, ранее использовавшемуся для object1
. Тогда вы можете получить object1
и object2
с одинаковым хэш-кодом... несмотря на то, что object1
и object2
являются разными объектами (согласно ==
).
Это хэш-коды... а не уникальные идентификаторы объектов.
Мое понимание идентичности заключается в том, что объекты внутри JVM уникальны в данный момент времени.
Личность уникальна. Идентификационные хэш-коды не являются. Как сказано в Object
javadoc :
"Насколько это целесообразно, метод
hashCode
, определенный классом Object, действительно возвращает разные целые числа для разных объектов."
Это далеко не гарантия уникальности.
А потом:
"(Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования Java™.)"
Он имеет в виду адрес объекта при первом вызове hashCode()
. В контракте для метода hashCode()
указано, что значение хэш-кода не может измениться. Идентификационный хэш-код... в действительности... запоминается как часть объекта, так что объект может быть перемещен сборщиком мусора.
Можно по определению.
identityHashCode
это int
. В Java всего 232 различных целых чисел.
Вы можете легко написать программу, которая создает более 232 объектов.
identityHashCode
. - person Mark Rotteveel   schedule 17.12.2015System.identityHashCode()
такое же, как и уObject.hashCode()
— оно просто игнорирует любые переопределенияhashCode()
в подклассах. - person Andreas Fester   schedule 17.12.2015