8

コレクションフレームワークのセットについて疑問がありました。セット自体が重複をどのように識別し、どのようにして知るようになるのでしょうか? 誰がそれがどのように実装されているか説明してもらえますか? hashcode と equals メソッドはどのように登場するのでしょうか? 私にとって非常に重要なので、簡単な説明が必要です。

4

6 に答える 6

8

大まかにこのように動作します

if (!collection.contains(element))
    collection.add(element);

そして、containsメソッドはequals/hashcodeを使用します。

TreeSetでは、要素は赤黒木に格納されますが、HashSetはHashMapを使用します。

実際、コンテナに追加される方法は要素(ツリー上のスポット、ハッシュテーブル内のバケット)に固有であるため、追加自体はequals/hashcodeを使用します。

于 2013-02-25T07:56:13.553 に答える
7

これは、 のjavadoc で説明されていSetます。

重複する要素を含まないコレクション。より正式には、セットには、e1.equals(e2) のような要素 e1 と e2 のペアが含まれず、最大でも 1 つの null 要素が含まれます。

于 2013-02-25T07:53:24.117 に答える
3

実際の実装はコンテナによって異なります。次に、挿入されたオブジェクトと格納されたオブジェクトを使用してテストします(これがHashMapiffを必要とする理由の 1 つです) 。hashCodeequalsa.equals(b)b.equals(a)

TreeMap一方、 はcompareToメソッドの結果に依存します (要素が実装するComparableか、compareメソッドが a によって実装される場合Comparator)。0 を返す場合compare、要素は「等しい」と見なされます。( equals 、つまりiffと一致するcompareTo必要があることに注意してください)。a.compareTo(b)==0a.equals(b)

于 2013-02-25T08:01:10.127 に答える
2

HashSethashcode()オブジェクトが移動するバケットを解決するために使用し、equals()メソッドを使用してそのバケットにあるオブジェクトの等価性をチェックします

于 2013-02-25T07:53:28.670 に答える