ハッシュ セットは「バケット」で機能します。ハッシュコードに従って、これらの「バケット」に値を格納します。equals(Object)
メソッドを使用して、メンバーが等しいかどうかに応じて、「バケット」に複数のメンバーを含めることができます。
したがって、議論のために、10 個のバケットでハッシュ セットを構築し、それに整数 1、2、3、5、7、11、および 13 を追加するとします。int のハッシュ コードは単なる int です。最終的には次のようになります。
- (空の)
- 1、11
- 2
- 3、13
- (空の)
- 5
- (空の)
- 7
- (空の)
- (空の)
セットを使用する従来の方法は、メンバーがそのセットに含まれているかどうかを確認することです。ですから、「11 はこのセットに含まれていますか?」と言うと、ハッシュ セットは 11 を 10 でモジュロし、1 を取得して、2 番目のバケットを調べます (もちろん、バケットは 0 から開始しています)。
これにより、メンバーがセットに属しているかどうかを非常に迅速に確認できます。さらに11を追加すると、ハッシュ セットは既に存在するかどうかを確認します。その場合、再度追加することはありません。メソッドを使用してequals(Object)
、もちろん 11 が 11 に等しいことを判断します。
「abc」のような文字列のハッシュ コードは、その文字列の文字によって異なります。重複する文字列「abc」を追加すると、ハッシュ セットは正しいバケットを検索し、equals(Object)
メソッドを使用してメンバーが既に存在するかどうかを確認します。stringのequals(Object)
メソッドも文字によって異なるため、"abc" は "abc" と同じです。
ただし、StringBuffer を使用する場合、各 StringBuffer にはオブジェクト ID に基づくハッシュ コードと等価性があります。equals(Object)
基本メソッドとメソッドをオーバーライドしないhashCode()
ため、すべての StringBuffer はハッシュ セットを別のオブジェクトのように見えます。それらは実際には重複していません。
StringBuffers を出力に出力するときは、StringBuffers で toString() メソッドを呼び出しています。これにより、重複した文字列のように見えるため、その出力が表示されます。
hashCode()
これが、 をオーバーライドする場合にオーバーライドすることが非常に重要である理由でもありますequals(Object)
。そうしないと、 Set が間違ったバケットにあるように見え、非常に奇妙で予測不可能な動作が発生します!