我在面向对象的上下文中读过有关对象标识的文章.其中说"你创建的每个对象都有自己独特的身份".但我对以下代码感到困惑.
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()之间有什么区别
您所看到的是因为您正在使用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)的类,你会得到不同的值.