Значения ссылок Java - это значения адресов?

Когда я делаю:

int x[] = new int[2];
System.out.println("...> " + x);

выходное значение будет таким: [I@1b67f74

так это шестнадцатеричное число относится к адресу памяти, где был размещен объект?

и [I что это значит?


person xdevel2000    schedule 08.10.2009    source источник


Ответы (4)


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

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

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

В документации по API java.lang.Object.hashCode() говорится:

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

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

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

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

person Jesper    schedule 08.10.2009
comment
В JVM Sun он получен из адреса объекта во время первого вызова hashCode. Например, вы увидите нечетные хеш-значения, и они не будут адресами. Также сборщик мусора перемещает объекты в памяти. - person Tom Hawtin - tackline; 08.10.2009
comment
+1. Также обратите внимание, что на 64-битных виртуальных машинах не может быть разумно однозначного соответствия между (32-битными) хэш-кодами и (64-битными) адресами объектов. - person gustafc; 08.10.2009
comment
Нет +1 от меня. Строго говоря, число, показанное в шестнадцатеричном формате, является значением identityHashcode объекта. Это только хэш-код объекта, если класс объекта не переопределяет метод хэш-кода. IdentityHashCode может быть связан или не быть связан с исходным адресом объекта. Конечно, это не будет связано с текущим адресом объекта, если сборщик мусора его переместит. - person Stephen C; 08.10.2009
comment
@Stephen C - добавлена ​​цитата из Object.toString() документации. Он не говорит, что использует значение identityHashCode. В остальном то, что вы сказали, именно то, что я написал выше ... - person Jesper; 09.10.2009

От: Java: синтаксис и значение [B @ 1ef9157? Двоичный / адрес?

Шестнадцатеричные цифры - это идентификатор объекта или хэш-код.

person RHSeeger    schedule 08.10.2009

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

person Hosam Aly    schedule 08.10.2009

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

person Omry Yadan    schedule 08.10.2009
comment
Обратите внимание, что JVM может перемещать объекты в памяти, и поэтому System.identityHashcode () в Sun JVM возвращает начальный адрес. Фактический адрес может измениться. - person Brian Agnew; 08.10.2009
comment
Обратите внимание, что System.identityHashCode может давать одно и то же значение для разных объектов. - person Tom Hawtin - tackline; 08.10.2009