コントラクトに「2 つのオブジェクトが等しい場合、同じハッシュ コードを返す必要がある」と書かれていることは知っています。これは、これらのオブジェクトを同じハッシュ バケットに配置し、ハッシュ コード関連のコレクション関数を改善するためです。次に、「2つのオブジェクトが同じハッシュコードを持っている場合、それらは常に等しいとは限らない」と言う理由です。つまり、契約でそれが真である場合、「2 つのオブジェクトが等しい場合、それらは同じハッシュ コードを返す可能性がありますが、これは必須ではありません」と言う必要があります。
5 に答える
つまり、契約でそれが真である場合、「2 つのオブジェクトが等しい場合、それらは同じハッシュ コードを返す可能性がありますが、これは必須ではありません」と言う必要があります。
いいえ、そうすべきではありません。これは、オブジェクトが検索されるたびに、たとえば aHashMap
または aHashSet
で、最初にに基づいて検索されるためですhashCode
(注: - は、 またはhashCode()
の場合は検索に使用されません。それらはコレクションではありません) 。 2 つのオブジェクトのハッシュコードが同じ場合、オブジェクト自体を比較するメソッドに移動します。ArrayList
LinkedList
hash based
equals
ここで、上記のステートメントが真である場合、それらのオブジェクトの最初のテスト自体が失敗するとします。つまり、2 つの等しいオブジェクトが異なるハッシュコードを持つことが許可されている場合、特定の hashCode を検索している間、正しい結果が返されないため、テストは に進まず、それらのオブジェクトが期待どおりでequals method
あることを宣言します。unequal
それらが等しくなるようにします。
次に、 2 番目のステートメントに移りましょう: -
2 つのオブジェクトが同じハッシュ コードを持つ場合、常に等しいとは限りません」
次のように理解しましょう: -hashCode
オブジェクトごとに生成されるため、タイプはであるため、最大の一意int
の を生成できます。それよりも多くのオブジェクトを保存したい場合にどうなるか想像してみてください。その場合、 の衝突が必要です。したがって、同じものを 2 つの異なるオブジェクトに割り当てる以外に方法はありません。したがって、上記のステートメントは正当化されます。2 ^ 32
hashcodes
two different objects
hashCodes
したがって、上記の説明から2 つのことが明らかです。
- 2 つの同じオブジェクトは、同じ hashCodes を持つ必要があります。
- 2 つの異なるオブジェクトが同じ hashCodes を持つことができます。
このトピックの詳細については、以下のリンクを参照してください (これ以上の説明はありません): -
いいえ。ドキュメントは正しく、混乱しています。
- 等しい 2 つのオブジェクトは、同じハッシュ コードを持つ必要があります。
- 同じハッシュ コードを持つ 2 つのオブジェクトは、等しくない可能性があります。
- ハッシュ テーブルのパフォーマンスを向上させるために、通常、等しくない2 つのオブジェクト に異なるハッシュ コードをできるだけ頻繁に持たせます。
たとえば、次は常に の有効な実装ですhashCode()
。
public int hashCode() {
return 0;
// clearly all equal objects have the same hash code -- 0
// but it's totally okay that unequal objects also have the same hash code
}
はバケットごとに複数のエントリHashMap
を格納でき、どのバケットが選択されるかはハッシュコードによって異なります。は、 を使用してバケットを識別し、そのバケット内で一致するキーを検索することにより、キーのエントリを検索します。HashMap
hashcode()
equals()
上記を考えると、ほとんど問題なく重複したハッシュコードを使用できることは明らかです (複数のオブジェクトが同じハッシュコードを持つ場合、HashMapsのパフォーマンスに影響しますが、すべてが機能します)。
ハッシュ関数は通常
一方向関数
: 一部の入力値 (オブジェクト) が同じハッシュコードを生成する場合があります。