10

让我们从代码开始。

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

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

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

现在上面,如果 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)
4

2 回答 2

13

我认为,实际上没有任何方法(即技术)可以保证对象 ID 的这种唯一性。这种识别的唯一目的是一种寻址该对象在内存中的数据的方法。万一这个对象死了,然后被 GC 从内存中删除,没有人会限制系统使用它以前的地址空间来放置新的对象的数据。

但实际上,在您的程序中有任何引用的所有可用对象中,在很短的一段时间内,System.identityHashCode(obj)实际上会给您该对象的唯一标识。这是因为这hashCode是使用对象的内存位置计算的。但是,它是一个实现特性,没有文档记录,也不能保证对于外国 JVM。

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

于 2013-01-24T11:34:33.130 回答
0

假设此 ID 实际上是哈希码并不重要,那么您可以通过让 Singleton 类生成分配给每个对象的 ID 来保证唯一 ID。然后,您可以使用该标识符而不是哈希码。

你的目标是什么,也许有更好的解决方案?

于 2013-01-24T11:37:23.227 回答