每个对象如何彼此不同

Sha*_*yaz 1 java hashcode

我在面向对象的上下文中读过有关对象标识的文章.其中说"你创建的每个对象都有自己独特的身份".但我对以下代码感到困惑.

     String str="Hello";
     String str1="Hello";
     System.out.println(str.hashCode()); //69609650
     System.out.println(str1.hashCode()); //69609650
     System.out.println(System.identityHashCode(str));//19313225
     System.out.println(System.identityHashCode(str1));//19313225
Run Code Online (Sandbox Code Playgroud)

str和str1的哈希码和identityhashcode是相同的.如果我理解错了,请纠正我.

另外hashcode()和system.identityhashcode()之间有什么区别

T.J*_*der 8

您所看到的是因为您正在使用String,它具有非常特殊(且几乎唯一)的行为:您的两个字符串实际上是一个String对象,因为字符串文字是自动intern.JDK和JVM一起工作以将字符串文字放入String重用的实例池中,而不是String为相同的字符序列创建单独的实例.

请尝试使用您的实验new Object():

 Object a = new Object();
 Object b = new Object();
 System.out.println(a.hashCode());
 System.out.println(b.hashCode());
 System.out.println(System.identityHashCode(a));
 System.out.println(System.identityHashCode(b));
Run Code Online (Sandbox Code Playgroud)

另外hashcode()和system.identityhashcode()之间有什么区别

hashCode该类可以重写该函数以返回适合该类的内容.System.identityHashCode返回相同的hashCode,如果子类没有覆盖它已经返回.Object#hashCode

因此Object,您可以从每个中获得相同的返回值.但是对于任何覆盖hashCode返回更适合该类(包括String)的类,你会得到不同的值.