当 toString() 和 hashCode() 被覆盖时,如何在 java 中获取对象的“对象引用”?

2022-08-31 08:55:01

我想在Java中打印对象的“对象引用”以进行调试。即,根据情况确保对象相同(或不同)。

问题是有问题的类继承自另一个类,该类覆盖了toString()和hashCode(),这通常会给我id。

示例情况:运行一个多线程应用程序,其中我(在开发期间)想要检查所有线程是否都使用资源对象的同一实例。


答案 1

你到底打算用它做什么(你想做什么与你需要打电话的东西有区别)。

hashCode,如JavaDocs中所定义,说:

尽管合理实用,但由类 Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但 Java™ 编程语言不需要这种实现技术。

因此,如果您使用来找出它是否是内存中的唯一对象,那么这不是一个好方法。hashCode()

System.identityHashCode 执行以下操作:

返回给定对象的哈希代码与默认方法 hashCode() 返回的哈希代码相同,无论给定对象的类是否覆盖 hashCode()。空引用的哈希代码为零。

对于你正在做的事情,这听起来像是你想要的......但是你想做什么可能不安全,这取决于库的实现方式。


答案 2

这就是我如何解决它:

Integer.toHexString(System.identityHashCode(object));