Печать адреса строковых экземпляров
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
Ответы
Ответ 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());