4

@ 和 # 在 toString 的输出上签名有什么区别?我有一个没有覆盖 toString 的 Java 对象。在查看日志文件时,我在某些行上看到

com.foo.model.orders.Order@10eb9e65

而在另一行(这个是从休眠中发出的)我看到了

com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796

有没有办法在这两个数字之间进行转换以确定它们是否是同一个实例?

4

3 回答 3

4

不。

这两个数字都只是来自两个不同系统的任意内部细节。既不保证它们是什么,也不保证它们是如何制定的。

如果您确实提出了某种翻译,那么在任何环境变化(库/JVM 的不同补丁版本,使用不同大小的堆运行等)下,它都会非常脆弱并且容易在没有警告的情况下中断。而且我怀疑两者之间可能没有任何联系。我知道第一个数字是由 JVM 通常根据对象占用的实际内存位置生成的。第二个将是 Hibernate 生成的某种散列 - 它无法访问与 JVM 相同的信息,因此很可能不会使用相同的输入。

于 2013-05-28T17:00:46.420 回答
1

正如您所猜测的,哈希格式来自 Hibernate。为了从您的问题的评论中回答我自己的问题,Hibernate 在几个地方记录了实体/类名称、哈希符号,然后是实体的主键。com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796Order with primary key 也是如此51a4cfa1e4b047bf2ab9b796

正如其他人所说,如果你想检查两个对象是否是同一个实例,==会比比较它们的字符串表示更简单可靠。

于 2013-05-28T17:23:10.527 回答
0

如果您试图确定 2 个对象引用是否引用同一个实例,请使用Object.equals

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true。

如果您只想让您的日志文件显示足够的信息来确定它们是否是同一个实例,请覆盖toString以提供足够的信息,或更改您的记录器消息。

- - 编辑 - -

为了根据@Jimothy 评论澄清,请使用order1 == order2而不是.equals

于 2013-05-28T17:03:30.317 回答