繁体   English   中英

Java toString输出中@和#之间的区别?

[英]Difference between @ and # in Java toString output?

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

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

而在另一条线上(这个是从休眠中发出的)我明白了

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

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

没有。

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

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

正如您所推测的那样,散列格式来自Hibernate。 要从你的问题的评论回答我自己的问题,Hibernate在几个地方记录实体/类名,哈希符号,然后是实体的主键。 因此, com.foo.model.orders.Order#51a4cfa1e4b047bf2ab9b796是具有主键51a4cfa1e4b047bf2ab9b796的订单。

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

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

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

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

----编辑----

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM