2009-10-08 2 views

ответ

10

Нет, этот шестнадцатеричный номер не должен интерпретироваться как адрес памяти, в котором находится объект. Фактически, это хэш-код объекта. Документация API из Object.toString() говорит:

метод ToString для класса Object возвращает строку, состоящую из имени класса которого объект является экземпляром, на-знака символ `@», и без знака шестнадцатеричного представление хэш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

Документация API из java.lang.Object.hashCode() говорит:

Насколько разумно практично, метод хэш-код определяется классом Объект возвращает отдельные целые числа для разных объектов. (Это, как правило, реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется язык программирования JavaTM.)

Так что для виртуальной машины Java Sun, если вы не отменяете метод hashCode(), то это действительно адрес памяти объекта, но нет никакой гарантии, что это так, поэтому вы не должны зависеть от него.

Существует нет (реального, надежного) способа (который работает на любом JVM), чтобы получить адрес памяти объекта в чистой Java; Java не имеет указателей, а ссылки не совсем такие же, как указатели.

Section 4.3.2 Спецификация виртуальной машины Java объясняет, что означает [I; в этом случае это означает, что ваша переменная представляет собой массив из int.

+4

На Sun JVM это происходит от адреса объекта в то время, когда 'hashCode' был сначала вызван на него. Например, вы увидите нечетные значения хэша, и они не будут адресами.Также сборщик мусора перемещает объекты в памяти. –

+2

+1. Также обратите внимание, что на 64-битных виртуальных машинах невозможно однозначно сопоставлять между собой (32-разрядные) хэш-коды и (64-разрядные) адреса объектов. – gustafc

+0

Нет +1 от меня. Строго говоря, число, показанное в шестнадцатеричном виде, является значением идентификатора объекта Hashcode. Это только хэш-код объекта, если класс объекта не переопределяет метод hashcode. IdentityHashCode может быть или не быть связан с исходным адресом объекта. Конечно, он не будет связан с текущим адресом объекта, если GC переместит его. –

0

[I означает, что это массив ([) целых чисел (I).

0

[Я обозначает имя класса массива int. номер адреса в vm, но поскольку hashCode обычно переопределяется, нецелесообразно использовать его непосредственно для идентификации объекта. для этого используйте System.identityHashcode (Object x), который надежно возвращает одно и то же значение.

+0

Обратите внимание, что JVM свободен перемещать объекты в памяти, поэтому System.identityHashcode() в Sun JVM возвращает * начальный * адрес. Фактический адрес может измениться. –

+0

Обратите внимание, что 'System.identityHashCode' может давать одинаковое значение для разных объектов. –

Смежные вопросы