Java では、セットに 2 つの一意のオブジェクトを含めることはできませんが、リストにはその制限がありません。一意のオブジェクトを識別するセット内のメカニズムは何ですか? ほとんどの場合、equals メソッドまたは hashCode メソッド、または追加されている両方のオブジェクトの実装である可能性があります。一意のオブジェクトを識別する実際のメカニズムを知っている人はいますか? それはequalsメソッド、hashcodeメソッド、または両方のメソッドですか、それとも何か他のものですか?
2 に答える
実装に依存しSet
ます。HashSet
との場合、とメソッドLinkedHashSet
の両方を使用します。の場合、オブジェクトの自然または特定の提供を使用します。equals
hashCode
TreeSet
Comparator
Comparator
基本的に、Set
javadocはこれを説明しています (強調は私のものです):
重複する要素を含まないコレクション。より正式には、セットには、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 (または比較) メソッドを使用してすべての要素の比較を実行します。
HashSet Source: 要素は a にキーとして格納されているようでHashMap
(一意のキーが必要です)、 in のput
メソッドは次をHashMap
チェックします:
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
したがって、 hash と runs の両方を比較しますequals
。
TreeSet は TreeMap を使用してデータをバックアップし、TreeMapsput
はコンパレータを使用します。