@和#符号与toString的输出有什么区别?我有一个不覆盖toString的Java对象。在查看日志文件时,我在某些行上看到了
com.foo.model.orders.Order@10eb9e65
在另一行(这是从休眠中发出的)我看到了
com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796
有没有办法在这两个数字之间进行转换,以确定它们是否是同一个实例?
答案 0 :(得分:4)
没有
这两个数字都只是来自两个不同系统的任意内部细节。既不能保证它们是什么,也不知道它们是如何制定出来的。
如果您确实提出了某种翻译,那么它会非常脆弱,并且在任何情况下都会在没有警告的情况下破坏(库/ JVM的不同补丁版本,使用不同大小的堆运行等) 。而且我怀疑两者之间可能没有联系。我知道第一个数字是由JVM生成的,通常基于对象占用的实际内存位置。第二种是由Hibernate生成的某种哈希 - 它不能访问与JVM相同的信息,因此可能不会使用相同的输入。
答案 1 :(得分:1)
正如您所推测的那样,哈希格式来自Hibernate。要从你的问题的评论回答我自己的问题,Hibernate在几个地方记录实体/类名,哈希符号,然后是实体的主键。因此com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796
是主键51a4cfa1e4b047bf2ab9b796
的订单。
正如其他人所说,如果你想检查两个对象是否是同一个实例,==
会做到这一点,比比较它们的字符串表示更简单可靠。
答案 2 :(得分:0)
如果您要确定2个对象引用是否引用同一个实例,请使用Object.equals
类Object的equals方法实现最具辨别力 对象可能的等价关系;也就是说,对于任何非null 引用值x和y,当且仅当x时,此方法返回true 和y引用相同的对象(x == y的值为true)。
如果您只是希望您的日志文件显示足够的信息以确定它们是否是同一个实例,请覆盖toString
以提供足够的信息,或更改您的记录器消息。
----编辑----
要根据@Jimothy评论澄清,请使用order1 == order2
代替.equals