Значения ссылок Java являются значениями адресов? - PullRequest
2 голосов
/ 08 октября 2009

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

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

выходное значение выглядит так: [I@1b67f74

чтобы шестнадцатеричное число относилось к адресу памяти, на котором был выделен объект?

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

Ответы [ 4 ]

10 голосов
/ 08 октября 2009

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

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

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

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

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

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

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

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

1 голос
/ 08 октября 2009

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

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

0 голосов
/ 08 октября 2009

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

0 голосов
/ 08 октября 2009

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

...