コレクションフレームワークのセットについて疑問がありました。セット自体が重複をどのように識別し、どのようにして知るようになるのでしょうか? 誰がそれがどのように実装されているか説明してもらえますか? hashcode と equals メソッドはどのように登場するのでしょうか? 私にとって非常に重要なので、簡単な説明が必要です。
6 に答える
大まかにこのように動作します
if (!collection.contains(element))
collection.add(element);
そして、containsメソッドはequals/hashcodeを使用します。
TreeSetでは、要素は赤黒木に格納されますが、HashSetはHashMapを使用します。
実際、コンテナに追加される方法は要素(ツリー上のスポット、ハッシュテーブル内のバケット)に固有であるため、追加自体はequals/hashcodeを使用します。
これは、 のjavadoc で説明されていSet
ます。
重複する要素を含まないコレクション。より正式には、セットには、e1.equals(e2) のような要素 e1 と e2 のペアが含まれず、最大でも 1 つの null 要素が含まれます。
実際の実装はコンテナによって異なります。次に、挿入されたオブジェクトと格納されたオブジェクトを使用してテストします(これがHashMap
iffを必要とする理由の 1 つです) 。hashCode
equals
a.equals(b)
b.equals(a)
TreeMap
一方、 はcompareTo
メソッドの結果に依存します (要素が実装するComparable
か、compare
メソッドが a によって実装される場合Comparator
)。0 を返す場合compare
、要素は「等しい」と見なされます。( equals 、つまりiffと一致するcompareTo
必要があることに注意してください)。a.compareTo(b)==0
a.equals(b)
HashSet
hashcode()
オブジェクトが移動するバケットを解決するために使用し、equals()
メソッドを使用してそのバケットにあるオブジェクトの等価性をチェックします