当我在 Intellij Idea 中调试 java 应用程序时,我会在堆栈帧中看到所有变量,如下所示:
object={java.lang.Object@77}
“@”后面的数字是什么意思?它与 hashCode 返回的不同。hashCode 以十六进制表示返回数字 2a134eca,它等于整数表示中的 705908426。数字 77 和 705908426 是不同的。
当我在 Intellij Idea 中调试 java 应用程序时,我会在堆栈帧中看到所有变量,如下所示:
object={java.lang.Object@77}
“@”后面的数字是什么意思?它与 hashCode 返回的不同。hashCode 以十六进制表示返回数字 2a134eca,它等于整数表示中的 705908426。数字 77 和 705908426 是不同的。
@ 是应用程序启动后的对象计数。所以@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"
我凭经验知道这一点,但我不知道实际的实现,但我认为它与这样的问题有关:
“@”后面的数字是什么意思?
@
只是一个分隔符
调试器使用toString
对象的方法来显示其值。以下是javadocstoString
中方法的默认实现的描述:
Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
对象类,后跟其内存地址。
In {java.lang.Object@77ddeeff}:
Class name: java.lang.Object
Memory Address: 77ddeeff
所以这个约定 name@address 就像我们的电子邮件地址一样(abc@gmail.com)abc 位于@gmail.com