我有这个问题。
我一直在我的项目中工作(我也在使用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
(对于此示例)
我很感激任何答案。
此致
答案 0 :(得分:3)
我需要为我正在使用的每个对象保留一个唯一的ID,这就是为什么我决定使用IdentityHashCode,据我所知,这个值在编译时是相同的。
没有。它与编译无关,它的不保证是唯一的。
目前还不清楚你要做什么,但你根本不应该将哈希码视为唯一 - 它们不能保证。
Object.hashCode
文档指定:
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。
这与保证它不是一回事。
您也对调用toString()
的结果感到困惑 - 我怀疑您的班级实际上覆盖了hashCode()
,而Object.toString()
调用了可能被覆盖的内容hashCode()
方法而不是使用标识哈希码:
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
如果您致电obj.hashCode()
,您会看到toString
显示的相同值。