1

我已经阅读了有关面向对象上下文中对象身份的文章。其中说“您创建的每个对象都有其自己的唯一身份”。但是我对下面的代码感到困惑。

     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 的哈希码和身份哈希码相同。如果我理解错误,请纠正我。

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

4

6 回答 6

8

您看到的是因为您正在使用String,它具有非常特殊(并且几乎是唯一)的行为:您的两个字符串实际上是一个String对象,因为字符串文字是自动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的返回值。hashCodeObject#hashCode

所以对于Object,你会从他们每个人那里得到相同的返回值。但是对于任何重写hashCode以返回更适合该类的内容的类(包括String),您将获得不同的值。

于 2013-09-17T10:07:59.383 回答
1

请注意,如果您声明

字符串 s2 = 新字符串(“你好”)
,
System.identityHashCode(s2);
将返回不同的哈希码。这是因为当声明就像
字符串 s = "某事"
, jvm 检查字符串池以找出是否有相同的文字。当声明就像
String s = new String("something");
jvm 总是创建一个新对象。

于 2013-09-17T10:19:47.537 回答
0

除了上一个答案,您还可以在此处阅读关于您的第二个问题的讨论:hashCode() 和 identityHashCode() 如何在后端工作?

于 2013-09-17T10:11:24.030 回答
0

如文档中所述(http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#identityHashCode(java.lang.Object)),identityHashCode给出相同的 HashCode,无论是不是 hashCode 方法被覆盖。

于 2013-09-17T10:12:55.850 回答
0

您的两个对象都是内部字符串常量。JVM 确保它们是相同的对象。

hashCode 和 identityHashCode 的区别在于 hashCode 是字符串对象的值的散列,而 identityHashCode 是对象内部标识符的散列。

于 2013-09-17T10:47:20.607 回答
0

您不是在使用 String 对象,而是在使用 String 文字。它们之间有很大的区别。在您的情况下, str 和 str1 都指向字符串池中的同一个“Hello”对象。尝试做这样的事情:

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 创建新对象时,您可以看到 sb1 和 sb2 的 hashCode 不同。这意味着它们没有指向同一个对象。但是 str1 和 str2 指向同一个 String 对象。阅读有关字符串池和 permgen 空间的内容以获取更多信息。

于 2013-09-17T11:15:23.223 回答