我在面向对象的上下文中读过有关对象身份的文章。其中说“你创建的每个对象都有自己独特的身份”。但我对以下代码感到困惑。
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
str和str1的哈希码和identityhashcode是相同的。 如果我理解错误,请纠正我。
hashcode()和system.identityhashcode()
之间的区别是什么答案 0 :(得分:8)
您所看到的是因为您正在使用String
,它具有非常特殊的(并且几乎唯一)行为:您的两个字符串实际上是一个String
object,因为字符串文字是自动intern
'd。 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));
hashcode()和system.identityhashcode()
之间的区别是什么
类可以覆盖hashCode
函数,以返回适合该类的内容。 System.identityHashCode
返回hashCode
返回的Object
,如果子类未覆盖它的话。
因此,对于hashCode
,您将从每个中获得相同的返回值。但是对于任何覆盖String
以返回更适合该类(包括{{1}})的类的类,您将得到不同的值。
答案 1 :(得分:1)
请注意,如果您声明
String s2 = new String("Hello"),
System.identityHashCode(s2);将返回不同的哈希码。这是因为当声明类似于
String s = "something"时,jvm会检查字符串池以查明是否存在相同的文字。当声明类似于
String s = new String("something");时,jvm总是会创建一个新对象。
答案 2 :(得分:0)
除了上一个答案,您还可以在此处阅读有关第二个问题的讨论:How do hashCode() and identityHashCode() work at the back end?
答案 3 :(得分:0)
正如文档(http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#identityHashCode(java.lang.Object))中所述,identityHashCode给出了相同的HashCode,不管是否重写了hashCode方法。
答案 4 :(得分:0)
您的对象都是实习字符串常量。 JVM确保它们是相同的对象。
hashCode和identityHashCode之间的区别是hashCode是字符串对象的 balue 的哈希值,而identityHashCode是ibject内部标识符的哈希值。
答案 5 :(得分:0)
您没有使用String对象,而是使用String文字。 他们之间有很大的不同。在你的情况下,str和 str1都指向同一个" Hello" String池中的对象。尝试 做这样的事情:
StringBuilder sb1= new StringBuilder("Hello");
StringBuilder sb2= new StringBuilder("Hello");
System.out.println(sb1.hashCode());
System.out.println(sb2.hashCode());
System.out.println(System.identityHashCode(sb1));
System.out.println(System.identityHashCode(sb2));
输出:7214088 15020296 7214088 15020296
当StringBuilder创建新对象时,您可以看到hashCodefor sb1和sb2是不同的。这意味着他们没有指向 同一个对象。但是str1和str2指向同一个String对象。 阅读有关String Pools和permgen空间的更多信息 信息。