2011-09-09 16 views
0

私はequals()とhashCode()をオーバーライドしなければならないIntegerフィールドの周りに2つの単純なラッパークラスを持っています。結局、どちらもhashCode()に同じアルゴリズムを使用しているため、Integerフィールドが同じ場合はハッシュコードが衝突します。異なるクラスのハッシュコードの衝突

オブジェクトは異なるタイプなので、同じHashMapのキーとして混在させたい場合にのみ注意してください。二つのオブジェクトのために等しい

答えて

13

hashCode()は「これらのオブジェクトが等しい、equals()を呼び出すことで詳しく見てみチャンスがあります」と言います。これらのクラスのメソッドが正しい場合は、同じハッシュコードが問題になることはありません。

hashCode()の一般的な規則は、2つのオブジェクトが等しい場合、それらのハッシュコードも同じでなければならないということです。ルールは "2つのオブジェクトが同じハッシュコードを持つ場合、それらは等しいはずです。"

1

同じ値を持つ両方の型のオブジェクトを持つハッシュマップを持つ可能性が高い場合は、明らかに潜在的なパフォーマンス上の問題になります。 HashMapなどは実際のランタイムクラスを調べません。実際には、異なるクラスの2つのオブジェクトが等しいかどうかを判断する標準的な方法はありません(たとえば、List s ArrayListArrays.asListは等しいと比較する必要があります)。 HashMapについては、ヒットはあまりにも悪くないと思っていますが、最初の検査でヒットを得るための重要な利得があるプロービング実装については悪化する可能性があります。