领地申请的网站能备案吗/市场营销公司
问题
我想在Java中打印对象的"对象引用"以进行调试。即根据情况确保对象相同(或不同)。
问题是有问题的类继承自另一个类,它已经覆盖了toString()和hashCode(),这通常会给我id。
示例情况:运行多线程应用程序,其中我(在开发期间)想要检查所有线程是否使用相同的资源对象实例。
#1 热门回答(93 赞)
你打算用它做什么(你想做什么会影响你需要调用的东西)。
hashCode,如JavaDocs中所定义,表示:
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术。)
因此,如果你正在使用hashCode()来查明它是否是内存中的唯一对象,那么这不是一个好方法。
System.identityHashCode具有以下内容:
返回与默认方法hashCode()返回的给定对象相同的哈希码,无论给定对象的类是否覆盖hashCode()。空引用的哈希码为零。
对于你正在做的事情,这听起来像你想要的......但是你想要做的事情可能不安全,这取决于图书馆的实施方式。
#2 热门回答(44 赞)
这就是我解决它的方式:
Integer.toHexString(System.identityHashCode(object));
#3 热门回答(7 赞)
无论对象的hashCode或equals的实现如何,Double equals==将始终基于对象标识进行检查。当然 - 确保你正在比较的对象引用是volatile(在1.5 JVM中)。
如果你真的必须拥有原始的Object toString结果(虽然它不是你的示例用例的最佳解决方案),Commons Lang库有一个方法ObjectUtils.identityToString(Object),它可以做你想要的。来自JavaDoc:
public static java.lang.String identityToString(java.lang.Object object)
如果类没有覆盖toString本身,则获取由Object生成的toString。 null将返回null。
ObjectUtils.identityToString(null) = null
ObjectUtils.identityToString("") = "java.lang.String@1e23"
ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"