12

当我在 Intellij Idea 中调试 java 应用程序时,我会在堆栈帧中看到所有变量,如下所示:

object={java.lang.Object@77}

“@”后面的数字是什么意思?它与 hashCode 返回的不同。hashCode 以十六进制表示返回数字 2a134eca,它等于整数表示中的 705908426。数字 77 和 705908426 是不同的。

4

3 回答 3

9

@ 是应用程序启动后的对象计数。所以@1012 表示自应用程序启动以来创建的第 1012 个对象。

它不是身份哈希码。

这是一些证据:(我这么说是因为我实际上并不知道,但我观察到了)

public static void main(String [] args) throws Throwable {

    Object object = new Object();
    Object object1 = new Object();
    Integer foo = new Integer(5);
    Object object2 = new Object();
    String str = new String("bar");

    System.out.println("code :" + System.identityHashCode(object));

    RuntimeException exception = new RuntimeException();
    exception.printStackTrace(); //put breakpoint here


}

输出:代码:789451787 代码:java.lang.Object@2f0e140b

789451787=2f0e140b 顺便说一句...

IntelliJ 调试器的输出:

static = org.boon.core.MyClass
args = {java.lang.String[0]@**97**}
object = {java.lang.Object@**98**}
object1 = {java.lang.Object@**99**}
foo = {java.lang.Integer@**100**}"5"
object2 = {java.lang.Object@**101**}
str = {java.lang.String@**102**}"bar"
exception = {java.lang.RuntimeException@**103**}"java.lang.RuntimeException"

我凭经验知道这一点,但我不知道实际的实现,但我认为它与这样的问题有关:

as3:调试时有意义的对象识别

于 2013-10-22T02:20:46.840 回答
5

“@”后面的数字是什么意思?

@只是一个分隔符

调试器使用toString对象的方法来显示其值。以下是javadocstoString中方法的默认实现的描述:

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:

 getClass().getName() + '@' + Integer.toHexString(hashCode())
于 2013-10-21T09:21:27.510 回答
-3

对象类,后跟其内存地址。

In {java.lang.Object@77ddeeff}:
Class name: java.lang.Object
Memory Address: 77ddeeff

所以这个约定 name@address 就像我们的电子邮件地址一样(abc@gmail.com)abc 位于@gmail.com

于 2013-10-21T09:16:38.527 回答