每个对象如何彼此不同

时间:2013-09-17 10:06:49

标签: 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

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

hashcode()和system.identityhashcode()

之间的区别是什么

6 个答案:

答案 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空间的更多信息   信息。