ハッシュの衝突によりHashSetは安全ですか[重複]

Nov 24 2020
    Set<String> set = new HashSet<>();
    set.add("FB");
    set.add("Ea");
    set.add("G#");
    set.add("FB");
    for(String s : set)
        System.out.println(s.hashCode());

出力:

2236
2236
2236

私の質問は、ハッシュの衝突を常に処理するのか、ハッシュがまったく同じである場合にオブジェクトが異なることをどのように正確に知るのかということです。彼らは等しいかどうかをチェックしますか?もしそうなら、それはハッシュのポイントを打ち負かしません。

文字列にハッシュセットを使用した場合、作成しているプログラムのハッシュ衝突が事実上ないsha256と比較すると、失敗し、String.hashCode()が互いに衝突する可能性はどのくらいありますか?containsメソッドとaddメソッドの両方がハッシュをチェックしていないように見えるのに、なぜハッシュを使用しているのでしょうか。

回答

tentacle Nov 24 2020 at 15:59

等しいハッシュコードは、オブジェクトが等しいことを意味するものではありません。コレクションコントラクトによると、2つのオブジェクトが等しい場合、それらは同じハッシュコードを持つ必要があり、その逆ではありません。

setやmapなどのコレクション内のオブジェクトにハッシュの衝突があるかどうかは実際には問題ではありません。equalsメソッドがオブジェクトを区別できるようになるまで、オブジェクト正しく機能します。すべてのハッシュが同じである場合、セットはリストに効果的に低下するため、パフォーマンスが低下する可能性があります。