Адрес памяти переменных в Java



пожалуйста, посмотрите на картинку ниже.
Когда мы создаем объект в java с новым ключевым словом, мы получаем адрес памяти из ОС.



когда мы пишем out.println(objName) мы можем видеть "специальную" строку в качестве вывода. Мои вопросы:




  1. что это за выход?


  2. Если это адрес памяти, который нам дала ОС:



    a) как я могу преобразовать эту строку в двоичную?



    b) как я могу получить одну целочисленную переменную адрес?




alt text

697   9  

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

    Ничего не найдено.