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)が実際に得られます。これは、オブジェクトのメモリ内の場所を使用して計算されるためです。ただし、これは実装機能であり、文書化されておらず、外部 JVM に対して保証されていません。hashCode

また、次の有名な QA を読むこともできます: Java: hashCode() をオーバーライドするオブジェクトの一意の ID を取得する方法は?

于 2013-01-24T11:34:33.130 に答える
0

この ID が実際にハッシュコードであることが重要でないと仮定すると、各オブジェクトに割り当てられる ID を生成する Singleton クラスを持つことで、一意の ID を保証できます。その後、ハッシュコードではなくその識別子を使用できます。

あなたの目的は何ですか、おそらくもっと良い解決策がありますか?

于 2013-01-24T11:37:23.227 に答える