Когда я делаю:
int x[] = new int[2];
System.out.println("...> " + x);
выходное значение будет таким: [I@1b67f74
так это шестнадцатеричное число относится к адресу памяти, где был размещен объект?
и [I
что это значит?
Когда я делаю:
int x[] = new int[2];
System.out.println("...> " + x);
выходное значение будет таким: [I@1b67f74
так это шестнадцатеричное число относится к адресу памяти, где был размещен объект?
и [I
что это значит?
Нет, это шестнадцатеричное число не следует интерпретировать как адрес памяти, где расположен объект. По сути, это хеш-код объекта. В документации 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
.
hashCode
. Например, вы увидите нечетные хеш-значения, и они не будут адресами. Также сборщик мусора перемещает объекты в памяти.
- person Tom Hawtin - tackline; 08.10.2009
Object.toString()
документации. Он не говорит, что использует значение identityHashCode. В остальном то, что вы сказали, именно то, что я написал выше ...
- person Jesper; 09.10.2009
От: Java: синтаксис и значение [B @ 1ef9157? Двоичный / адрес?
Шестнадцатеричные цифры - это идентификатор объекта или хэш-код.
[I
означает, что это массив ([
) целых чисел (I
).
[I обозначает имя класса массива int. номер адреса в виртуальной машине, но поскольку hashCode обычно переопределяется, неразумно использовать его напрямую для идентификации объекта. для этого используйте System.identityHashcode (Object x), который надежно возвращает то же значение.
System.identityHashCode
может давать одно и то же значение для разных объектов.
- person Tom Hawtin - tackline; 08.10.2009