3

Java では、セットに 2 つの一意のオブジェクトを含めることはできませんが、リストにはその制限がありません。一意のオブジェクトを識別するセット内のメカニズムは何ですか? ほとんどの場合、equals メソッドまたは hashCode メソッド、または追加されている両方のオブジェクトの実装である可能性があります。一意のオブジェクトを識別する実際のメカニズムを知っている人はいますか? それはequalsメソッド、hashcodeメソッド、または両方のメソッドですか、それとも何か他のものですか?

4

2 に答える 2

6

実装に依存しSetます。HashSetとの場合、とメソッドLinkedHashSetの両方を使用します。の場合、オブジェクトの自然または特定の提供を使用します。equalshashCodeTreeSetComparatorComparator

基本的に、Setjavadocはこれを説明しています (強調は私のものです):

重複する要素を含まないコレクション。より正式には、セットには、e1.equals(e2) のような要素 e1 と e2 のペアが含まれず、最大でも 1 つの null 要素が含まれます。その名前が示すように、このインターフェイスは数学的集合の抽象化をモデル化します。

Set インターフェースは、Collection インターフェースから継承されたもの以外に、すべてのコンストラクターのコントラクトと、add、equals、および hashCode メソッドのコントラクトに追加の規定を配置します。

TreeSet実装されているため、別の動作がありますSortedSet(このインターフェイスはインターフェイスを拡張しSetます)。そのjavadocから(強調鉱山):

要素の全体的な順序付けをさらに提供する Set。要素は、自然な順序付けを使用するか、通常は並べ替えセットの作成時に提供される Comparator によって順序付けられます。セットの反復子は、要素の昇順でセットをトラバースします。)

並べ替えられたセットが Set インターフェースを正しく実装するためには、(明示的な比較子が提供されているかどうかに関係なく) 並べ替えられたセットによって維持される順序付けは、equals と一貫していなければならないことに注意してください (一貫性の正確な定義については、Comparable インターフェースまたは Comparator インターフェースを参照してください)。これは、Set インターフェースが equals 操作に関して定義されているためですが、ソートされたセットはその compareTo (または比較) メソッドを使用してすべての要素の比較を実行します。

于 2013-06-05T05:15:42.007 に答える
1

HashSet Source: 要素は a にキーとして格納されているようでHashMap(一意のキーが必要です)、 in のputメソッドは次をHashMapチェックします:

if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

したがって、 hash と runs の両方を比較しますequals

TreeSet は TreeMap を使用してデータをバックアップし、TreeMapsputはコンパレータを使用します。

于 2013-06-05T05:22:38.867 に答える