行#3の代わりに行#4を行うのに合理的な時間はいつですか?それとも完全に冗長な呼び出しですか?System.identityHashCode(obj)の使用 - いつですか?どうして?
1 Object o1 = new Object();
2
3 int hcObj = o1.hashCode();
4 int hcSys = System.identityHashCode(o1);
行#3の代わりに行#4を行うのに合理的な時間はいつですか?それとも完全に冗長な呼び出しですか?System.identityHashCode(obj)の使用 - いつですか?どうして?
1 Object o1 = new Object();
2
3 int hcObj = o1.hashCode();
4 int hcSys = System.identityHashCode(o1);
場合によっては、識別可能なオブジェクトのセットを作成することもできます。それらのオブジェクトのいくつかはと等しいかもしれませんお互いに、しかしあなたは依然として真に重複している参照を投げ捨ててすべてのものへの参照が必要です。 equals
の実装が興味のあるものではないため(実際にはそうしたくない場合はequals
をオーバーライドするクラスもあれば、実際に別のインスタンスなどをカウントしようとしているだけなので)
これを効率的に行うには(つまり、何らかのハッシュテーブルを利用する)、均等ではなく同一性に基づくハッシュコードが必要です。これはまさにidentityHashCode
のものです。 はめったにありません便利ですが、それはまだ時々便利です。
要するに、Guavaの「Equivalence.identity()」は何ですか?しかし、それでも、あなたは 'IdentityHash {Map、Set}'を持っています。 – fge
@fge: 'System.identityHashCode'は、それらのデータ構造のすべての実装方法です。 –
"(いくつかのオブジェクトは、あなたが実際にそれらを必要としないときに等価を実装します)"あなたの答えのこの部分を愛してください。ありがとう。 –
普通のObject
の場合は、それは冗長です。しかし、クラスが、hashCode
をオーバーライドできる型のインスタンスに対して、デフォルトのhashCode
の実装(参照の等価性に基づく)を使用する場合があります。
Grepcode lists these call sites、つまりIdentityHashMap
を含む。
ところで、どちらのメソッドもintではなくlongを返します – fge