2013-05-28 37 views
4

@和#之间的区别是什么toString的输出?我有一个不覆盖toString的Java对象。在通过日志文件的样子,我看到一些线Java和toString输出中@和#之间的区别?

[email protected] 

,而另一条线路上(这个人是从休眠射出)我看到

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

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

+0

Andrzej说,这是内部的东西。但'@'是'Integer.toHexString(System.identityHashCode(object))'的结果之后。但是我可能会错,因为我没有任何基础来证明:P –

+1

您的Order类是否使用UUIDGenerator分配主键?任何机会51a4cfa1e4b047bf2ab9b796是订单的主键? – Jimothy

回答

4

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

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

0

如果你正试图确定2个对象引用指向同一个实例,使用Object.equals

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

如果你只是想你的日志文件,以表现出足够的信息,以确定它们是否是相同的实例,覆盖toString提供足够的信息,或更改您的记录信息。

---- ----编辑

要按照@Jimothy评论澄清,用order1 == order2代替.equals

+0

更好地使用'=='。 “对象”确实如此。equals()'是等价的,但是如果一个子类重载equals()(当使用Hibernate时,它通常应该),那么这就不再成立。 – Jimothy

+0

@Jimothy,同意了。我声明object equals等于Object.equals是什么的引语,但是我看到我不清楚这一点。 – Lucas

1

散列格式,你猜测,来自休眠。为了回答自己的问题,Hibernate在几个地方记录了实体/类的名称,一个散列符号,然后是实体的主键。所以com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796是与主键51a4cfa1e4b047bf2ab9b796订单。

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

相关问题