在Java中打印唯一对象标识以进行调试

hyd*_*yde 6 java identity object uniqueidentifier

让我们从代码开始吧.

Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);
Run Code Online (Sandbox Code Playgroud)

然后在其他地方再次相同,或者可能在同一段代码中再次执行,可能在不同的线程中.

Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);
Run Code Online (Sandbox Code Playgroud)

现在上面,如果obj是同一个对象,显然调试打印将是相同的.但如果它们不同,仍然存在哈希冲突的可能性,因此即使对于不同的对象,打印输出也可能相同.因此具有相同的输出(或更一般地,相同的字符串)并不保证相同的对象.

问题:Java中有没有办法为任意对象获取唯一的id 字符串?或者更正式地说,给出static String Id.str(Object o)方法,以便始终如此:

final Object obj1 = ...;
final String firstId = Id.str(obj1);
// arbitrary time passes, garbage collections happen etc.
// firstId and obj1 are same variables as above
(firstId.equals(Id.str.obj2)) == (obj1 == obj2)
Run Code Online (Sandbox Code Playgroud)

And*_*niy 8

我认为,实际上没有任何方法(即技术)可以保证对象ID的唯一性.这种识别的唯一目的 - 是一种在内存中寻址此对象数据的方法.如果此对象死亡然后通过GC从内存中删除,则没有人会限制系统使用其以前的地址空间来放置新对象的数据.

但事实上,在一段短时间内,在程序中有任何引用的所有可用对象中,System.identityHashCode(obj)实际上会为您提供唯一的对象标识.这是因为这hashCode是使用对象的内存中位置计算的.但是,它是一个实现功能,没有记录并保证外部JVM.

此外,您可以阅读这个着名的QA:Java:如何获取覆盖hashCode()的对象的唯一ID?