@和#之间的区别是什么toString的输出?我有一个不覆盖toString的Java对象。在通过日志文件的样子,我看到一些线Java和toString输出中@和#之间的区别?
[email protected]
,而另一条线路上(这个人是从休眠射出)我看到
com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796
有没有办法在这两个数字之间进行转换,以确定它们是否是相同的实例?
@和#之间的区别是什么toString的输出?我有一个不覆盖toString的Java对象。在通过日志文件的样子,我看到一些线Java和toString输出中@和#之间的区别?
[email protected]
,而另一条线路上(这个人是从休眠射出)我看到
com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796
有没有办法在这两个数字之间进行转换,以确定它们是否是相同的实例?
第
这两个数字都是来自两个不同系统的任意内部细节。既不能保证它们是什么,也不能保证它们是如何制定出来的。
如果您确实想出了某种翻译,它会非常脆弱,并且在任何环境变化(不同的补丁版本的库/ JVM,以不同大小的堆等运行)下没有任何警告地突然中断。 )。我怀疑这两者之间可能没有联系。我知道第一个数字是由JVM通常根据对象占用的实际内存位置生成的。第二种是由Hibernate生成的某种散列 - 它不能访问与JVM相同的信息,因此可能不会使用相同的输入。
如果你正试图确定2个对象引用指向同一个实例,使用Object.equals
的等于Object类的方法实现对象上最挑剔的 可能等价关系;也就是说,对于任何非空 引用值x和y,当且仅当x 和y引用同一对象(x == y的值为true)时,此方法返回true。
如果你只是想你的日志文件,以表现出足够的信息,以确定它们是否是相同的实例,覆盖toString
提供足够的信息,或更改您的记录信息。
---- ----编辑
要按照@Jimothy评论澄清,用order1 == order2
代替.equals
散列格式,你猜测,来自休眠。为了回答自己的问题,Hibernate在几个地方记录了实体/类的名称,一个散列符号,然后是实体的主键。所以com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796
是与主键51a4cfa1e4b047bf2ab9b796
订单。
正如其他人所说,如果你想检查两个对象是否是同一个实例,==
将比这些对象的字符串表示更简单可靠。
Andrzej说,这是内部的东西。但'@'是'Integer.toHexString(System.identityHashCode(object))'的结果之后。但是我可能会错,因为我没有任何基础来证明:P –
您的Order类是否使用UUIDGenerator分配主键?任何机会51a4cfa1e4b047bf2ab9b796是订单的主键? – Jimothy