【问题标题】:object identityhashcode in javajava中的对象标识哈希码
【发布时间】:2013-06-18 13:53:01
【问题描述】:

我一直在从事我的项目(我也在使用 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

如您所见,这两个值(18e588c1ec1758)完全不同,但我不明白为什么。到现在为止,我唯一做的事情(并且有效)是获取对象的字符串,然后使用子字符串方法获取18e588c(对于这个例子)

我将不胜感激。

【问题讨论】:

  • 您的对象(obj)是在哪里制作的?它是由hibernate还是其他框架制作的?看起来您的对象只是一个代理,如果您调用 obj.toString(),那么它可以真正回答该对象已被删除。这意味着内部对象已被删除或数据库连接已关闭等。但是引用对象的 hashCode 存在,因此您可以打印该 hashCode。
  • 您是否为您的班级覆盖了hashCode()?如果是这样,您需要提供您的实现代码。

标签: java object hashcode uniqueidentifier


【解决方案1】:

我需要为我正在使用的每个对象保留一个唯一的 ID,这就是我决定使用 IdentityHashCode 的原因,据我了解,这个值通过编译是相同的。

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

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

Object.hashCode 文档指定:

在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。

但这与保证不一样。

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

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

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

如果您调用 obj.hashCode(),您将看到与 toString 显示的值相同的值。

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多