2013-06-21 31 views
0

我有这个问题。java中的对象identityhashcode

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

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

事情是这样的:

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

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

但作为一个结果,我得到这样的:

的对象是:***xxxxxxxxxxxxxx***[email protected] (name: Comment) has been removed.

哈希ID是:1ec1758

正如你所看到的两个值是完全不同的,但我不明白为什么。到目前为止,我所做的(和它的工作)唯一的事情是获取对象的字符串,然后使用子字符串方法获得18e588c(在这个例子中)

我会很感激任何答案。

问候

+0

哪里是你的对象(obj)制成?它是由休眠或其他框架?它看起来像你的对象只是一个代理,如果你调用obj.toString(),所以它可以真正回答该对象已被删除。这意味着内部对象已被删除或数据库连接已关闭等。但被引用对象的hashCode存在,因此您可以打印该hashCode。 –

+0

你是否为你的类重写了'hashCode()'?如果是这样,你需要提供你的实现代码。 – Raedwald

回答

3

我需要保持一个唯一的ID,我使用的每个对象,这就是为什么我决定使用IdentityHashCode,据我了解,这个数值是通过编译相同。

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

目前尚不清楚你想要做什么,但你不应该把哈希代码视为唯一 - 它们不能保证是。

Object.hashCode文档指定:

多达是合理可行,由Object类定义的hashCode方法并返回不同的整数为不同的对象。

虽然这与保证它不是一回事。

通过调用toString()的结果感到困惑 - 我怀疑你的类实际上覆盖hashCode()Object.toString()调用可能-覆盖hashCode()方法,而不是使用标识的散列码:

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

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

如果你打电话obj.hashCode()你会看到真实的toString显示相同的值。