Печать адреса строковых экземпляров - программирование
Подтвердить что ты не робот

Печать адреса строковых экземпляров

package com.testProject;
public class JavaSample {

    public static void main(String[] args) {

        String myString1 = new String("Sample1");
        System.out.println(myString1);
        String myString2 = new String("Sample2");
        System.out.println(myString2);
    }
}

в приведенном выше фрагменте кода, как печатать адрес этих строк, которые я создал "Sample1" и "Sample2", мне нужно распечатать ячейку памяти объекта String myString1 и myString2

4b9b3361

Ответ 1

Если вы имеете в виду "адрес", как это:

System.out.println(new Object());

java.lang.Object @ 31ec0130

то вы можете просто сделать,

String s = new String("one");
System.out.println(Integer.toHexString(s.hashCode()));

1ae66

Так как вы считаете, что "адрес" - это просто hashCode(), преобразованный в шестую строку.

Ответ 2

Как указывалось в моем комментарии, это не рекомендуется, но поскольку вы спросили...

private static Unsafe unsafe;

static
{
    try
    {
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        unsafe = (Unsafe)field.get(null);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

public static long addressOf(Object o)
throws Exception
{
    Object[] array = new Object[] {o};

    long baseOffset = unsafe.arrayBaseOffset(Object[].class);
    int addressSize = unsafe.addressSize();
    long objectAddress;
    switch (addressSize)
    {
        case 4:
            objectAddress = unsafe.getInt(array, baseOffset);
            break;
        case 8:
            objectAddress = unsafe.getLong(array, baseOffset);
            break;
        default:
            throw new Error("unsupported address size: " + addressSize);
    }       

    return(objectAddress);
}

Ответ 3

Адреса памяти обычно не доступны через язык Java, но System.identityHashCode(myString1) может быть достаточно близко, в зависимости от того, чего вы пытаетесь достичь.

Ответ 4

похоже, что вы ВСЕ НЕПРАВИЛЬНО! Я пытаюсь объяснить:

        String s = new String("hi Mr. Buddy");
//        s = = "hi Mr. Buddy"; //is false
//        s.equals("hi Mr. Buddy"); //is true
        System.out.println( s.hashCode() );
        System.out.println( "hi Mr. Buddy".hashCode() );

        System.out.println( "hi Mr. Buddy" == s );

        System.out.println( "hi Mr. Buddy" );

результат этого в моем случае:

1372880496
1372880496
false
hi Mr. Buddy

Как мы видим, hashCode() такие же, но String имеет разные адреса (bcs "привет г-н Бадди" == s → == false) ? как вы думаете?

Я нашел:

System.out.println( "s=" + System.identityHashCode( s ) );
System.out.println( "..=" + System.identityHashCode( "hi Mr. Buddy" ) );

результат:

s=733003674
..=1626549726

Ответ 5

На самом деле вы не можете. JVM обрабатывает память, а gc может перемещать данные по мере их соответствия.

Таким образом, нет никакой "реальной" концепции адреса памяти в Java (это только проблема JVM)

Ответ 6

Почему вы не используете printf с% b:

String s= new String("Hello");
System.out.println(Integer.toHexString(s.hashCode()));
System.out.printf("address of the reference variable s holding string \"%s\" is %h%n", s,s);

Ответ 7

просто правое имя строки ur, за которым следует этот код:

string object.getClass.getName()+'@'+Integer.toHexString(string boject.hashCode());

Пример:

String str=new String("Hello");
System.out.println(str.getClass.getName+'@'+Integer.toHexString(str.hashCode());