Адрес памяти переменных в Java
пожалуйста, посмотрите на картинку ниже.
Когда мы создаем объект в java с новым ключевым словом, мы получаем адрес памяти из ОС.
когда мы пишем out.println(objName) мы можем видеть "специальную" строку в качестве вывода. Мои вопросы:
- что это за выход?
Если это адрес памяти, который нам дала ОС:
a) как я могу преобразовать эту строку в двоичную?
b) как я могу получить одну целочисленную переменную адрес?

9 ответов:
можно использовать
sun.misc.Unsafe: смотрите этот отличный ответ от @Peter Lawrey ->есть ли способ получить адрес ссылки?используя свой код для printAddresses ():
public static void printAddresses(String label, Object... objects) { System.out.print(label + ": 0x"); long last = 0; int offset = unsafe.arrayBaseOffset(objects.getClass()); int scale = unsafe.arrayIndexScale(objects.getClass()); switch (scale) { case 4: long factor = is64bit ? 8 : 1; final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor; System.out.print(Long.toHexString(i1)); last = i1; for (int i = 1; i < objects.length; i++) { final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor; if (i2 > last) System.out.print(", +" + Long.toHexString(i2 - last)); else System.out.print(", -" + Long.toHexString( last - i2)); last = i2; } break; case 8: throw new AssertionError("Not supported"); } System.out.println(); }Я настроил этот тест:
//hashcode System.out.println("Hashcode : "+myObject.hashCode()); System.out.println("Hashcode : "+System.identityHashCode(myObject)); System.out.println("Hashcode (HEX) : "+Integer.toHexString(myObject.hashCode())); //toString System.out.println("toString : "+String.valueOf(myObject)); printAddresses("Address", myObject);вот вывод :
Hashcode : 125665513 Hashcode : 125665513 Hashcode (HEX) : 77d80e9 toString : java.lang.Object@77d80e9 Address: 0x7aae62270вывод :
- хэш-код != адрес
- toString = class@HEX (hashcode)
это выход реализации объекта " toString ()". Если ваш класс переопределяет toString (), он будет печатать что-то совершенно другое.
Это Не памяти по адресу Это classname@hashcode
здесь
classname = полное полное имя или абсолютное имя (т. е. имя пакета, за которым следует имя класса)
hashcode = шестнадцатеричный формат (System.identityHashCode (obj) или obj.метод hashCode() даст вам хэш-код в десятичном формате)
то, что вы получаете, является результатом метода toString() класса объектов или, точнее, identityHashCode (), как указал uzay95.
" когда мы создаем объект в java с новым ключевым словом, мы получаем адрес памяти из ОС."
важно понимать, что все, что вы делаете в Java выполняется виртуальной машиной Java. Именно JVM предоставляет эту информацию. Что на самом деле происходит в ОЗУ операционной системы полностью зависит от реализации JRE.
Как сказал Сунил, это не адрес в памяти.Это просто hashcode
чтобы получить тот же @ content, вы можете:
если хэш-код не переопределен в классе:
"@" + Integer.toHexString(obj.hashCode())если хэш-код переопределен, вы получаете исходное значение с помощью:
"@" + Integer.toHexString(System.identityHashCode(obj))это часто путают с адресом памяти, потому что если вы не переопределяете hashCode(), адрес памяти используется для вычисления хэша.
Это полезно знать о хэш-коде в java:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
в Java, когда вы делаете объект из класса, как
Person p = new Person();,pна самом деле адрес ячейки памяти, которая указывает на типPerson.при использовании statemenet для печати
pвы увидите адрес. Элементnewключевое слово делает новую ячейку памяти, содержащую все переменные экземпляра и методы, которые включены вclass Personиpявляется ссылочной переменной, указывающей на эту ячейку памяти.
toString () - это функция в java.ленг.Библиотека объектов, которая возвращает строковое представление ссылки на объект тело toString () выглядит следующим образом
public String toString(Object arg) { return "fully_qualified_className@address"; }здесь адрес задается JVM не OS
вы можете переопределить функцию toString (), предоставив свою собственную реализацию в теле функции
Comments