打印字符串实例的地址

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的内存位置

如果你的意思是“地址”:

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

java.lang.Object @ 31ec0130

那么你可以这样做,

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

1ae66

因为您认为“地址”只是将hashCode()转换为hex字符串。


边注
这个答案在历史上被认为是正确的,只适用于没有覆盖hashCode()方法的类,但是(如注释中所述)它不适用于String类,因为它们覆盖了hashCode()方法。 寻找有关此问题主题的最新信息的读者应首先阅读有关此答案的所有评论/讨论,并应查阅更多资源,或提出新问题引用此问题和答案,并明确要求提供有关此问题的新信息。自写完以来发生了变化的事情。

正如我的评论所指出的,这不是推荐的做法,但既然你问过…

 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); } 

内存地址通常不能通过Java语言获得,但System.identityHashCode(myString1)可能足够接近,具体取决于您要实现的目标。

好像你们都是不正确的! 我试着解释一下:

  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“hi Mr. Buddy”== s >> == false)? 你怎么看 ?

我发现 :

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

结果是:

 s=733003674 ..=1626549726 

其实你做不到。 JVM处理内存,gc可以在认为合适时移动数据。

所以Java中没有“真实”的内存地址概念(它只是JVM的关注点)

为什么不将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); 

只需要你的字符串名称后跟这段代码:

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

例:

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