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
答案 0 :(得分:12)
正如我的评论所指出的,这不是推荐的做法,但是因为你问过......
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);
}
答案 1 :(得分:10)
ml.exe /c /Cx /coff prog.asm
cl.exe /MD /LD /Fe"prog.dll" "prog.obj" /link /entry:prog ext.lib
在我的案例中的结果:
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" );
我们看到hashCode()是相同的,但String有不同的地址(bcs"在Buddy先生" == s>> == false) ?你觉得怎么样?
我找到了:
1372880496
1372880496
false
hi Mr. Buddy
结果是:
System.out.println( "s=" + System.identityHashCode( s ) );
System.out.println( "..=" + System.identityHashCode( "hi Mr. Buddy" ) );
答案 2 :(得分:8)
通常不能通过Java语言提供内存地址,但System.identityHashCode(myString1)
可能足够接近,具体取决于您要实现的目标。
答案 3 :(得分:8)
如果你的意思是“地址”:
System.out.println(new Object());
java.lang.Object中@的 31ec0130 强>
然后你就可以了,
String s = new String("one");
System.out.println(Integer.toHexString(s.hashCode()));
1ae66
因为您认为“地址”只是将hashCode()转换为十六进制字符串。
旁注
此答案在历史上被认为是正确的,仅适用于未覆盖hashCode()
的类 方法,但(如评论中所述)它不适用于String
类,因为它们覆盖了hashCode()
方法。读者寻找最新的 关于这个问题的主题的信息应该首先通过所有 关于这个答案的评论/讨论,应该进一步咨询 资源,或引用这个问题和答案的新问题 明确要求有关已发生变化的事情的新信息 因为他们写的。
答案 4 :(得分:1)
其实你做不到。 JVM处理内存,gc可以在看到合适时移动数据。
因此Java中没有“真实”的内存地址概念(它只是JVM的关注点)
答案 5 :(得分:1)
我认为@AnNik的回答应被视为正确的答案。下面是比较,
String s1= "abc";
String s2 = new String("abc");
String s3= "abc";
System.out.println(Integer.toHexString(s1.hashCode()));
System.out.println(Integer.toHexString(s2.hashCode()));
System.out.println(Integer.toHexString(s3.hashCode()));
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(System.identityHashCode(s3));
输出:
17862
17862
17862
356573597
1735600054
356573597
答案 6 :(得分:0)
为什么不将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 :(得分:-1)
只需输入您的字符串名称后跟此代码:
string object.getClass.getName()+'@'+Integer.toHexString(string boject.hashCode());
示例:
String str=new String("Hello");
System.out.println(str.getClass.getName+'@'+Integer.toHexString(str.hashCode());