java中的对象identityhashcode

时间:2013-06-21 12:21:30

标签: java object hashcode uniqueidentifier

我有这个问题。

我一直在我的项目中工作(我也在使用EMF比较)。我需要为我正在使用的每个对象保留一个唯一的ID,这就是为什么我决定使用IdentityHashCode,据我所知,这个值在编译时是相同的。

我已经将对象作为另一个类的方法中的参数,但是当我尝试获取哈希码时,这与我在打印对象的值时看到的不一样。

这样的事情:

System.out.println("The Object is: "+obj)

System.out.println("The hash ID is: +Integer.toHexString(System.identityHashCode(obj)));

但结果我得到了这个:

对象是:***xxxxxxxxxxxxxx***.EntityImpl@18e588c (name: Comment) has been removed.

哈希ID为:1ec1758

正如你所看到的那两个值完全不同,但我无法理解为什么。到目前为止,我所做的唯一事情(并且它有效)是获取对象的String,然后使用substring方法获取18e588c(对于此示例)

我很感激任何答案。

此致

1 个答案:

答案 0 :(得分:3)

  

我需要为我正在使用的每个对象保留一个唯一的ID,这就是为什么我决定使用IdentityHashCode,据我所知,这个值在编译时是相同的。

没有。它与编译无关,它的保证是唯一的。

目前还不清楚你要做什么,但你根本不应该将哈希码视为唯一 - 它们不能保证。

Object.hashCode文档指定:

  

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。

这与保证它不是一回事。

对调用toString()的结果感到困惑 - 我怀疑您的班级实际上覆盖了hashCode(),而Object.toString()调用了可能被覆盖的内容hashCode()方法而不是使用标识哈希码:

  

类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

如果您致电obj.hashCode(),您会看到toString显示的相同值。