Java:如何打印Integer对象的引用



假设

Integer integerA = 500;

我想打印返回的参考资料。

要将对对象的引用作为数字,您可以在支持它的JVM上使用Unsafe。您可以将引用放在数组中,并使用Unsafe.getInt()对32位引用进行访问(注意:大多数64位JVM将使用32位引用)或Unsafe.getLong()这将以数字形式访问引用,但是如果GC发生并且对象被移动,那么一旦得到它,它就可能改变。

另一个复杂的问题是CompressedOops意味着对象的索引可以用多种不同的方式转换。为了保持简单,我建议使用4GB到26GB的堆。对于这些大小,您可以将地址移动<< 3以获得地址。

BTW您可以使用Unsafe.putInt(x,1,hashCode)来覆盖系统hashCode.;)

最接近显示引用的是哈希代码,因为它将由Object,System.IdentityHashCode()计算。当然,Integer会覆盖hashCode,所以Integer自己的hashCode()方法肯定与它的引用无关。

事实上,不能保证System.IdentityHashCode与引用有任何关系——它只是一个在为同一对象计算时始终相同的数字,而在不同对象中则尽可能不同。

人们一直在回答hashCode(),但hashCode()对于Integer来说是Integer的值,它与它在内存中的位置无关。此外,通常,仅仅因为两个Objects具有相同的hashCode()而不是并不意味着它们引用相同的Object

编辑(回应评论)
即使您使用IdentityHashCode(),它提供了hashCode()的非重写版本,您仍然无法获得内存地址。

在Integer类中打印重载版本的"toString"方法。通常,如果一个类没有重载该方法,它会打印类名+哈希代码。像这样的事情(你必须手工完成):

integerA.getClass().getName() + "@" + integerA.hashCode()

我不相信可以在Java中获得对象的实际内存位置(用于打印或其他目的)。即使在执行System.out.println(new Object())时,您看到的也不是"引用"位置,而是包含对象哈希代码的字符串。

各个类的默认toString方法涉及hashCode方法的结果。也许你正在寻找它,因为它是我能想到的最接近"打印参考资料"的。

默认实现(如果它没有被覆盖)会将对象打印为类似的东西

Integer i = 95;
System.out.println(i.getClass().getName() + "@" + Integer.toHexString(i.hashCode()));
//java.lang.Integer@5f

在整数的情况下,hashCode值与基础值相同。

最新更新