回答:
Set
、put()
操作によって置き換えられることはありません。
Set
気づきましたput()
。この場合、それは再びキーの横に置かれた同じ値です。これは、キーが存在するかどうかを確認して置くよりも良い場合とそうでない場合があります。どちらにしても、私はそれがどのように機能するかを理解しています。
HashSet
の形で実装された効果だと思いますHashMap
。ただし、あなたがクラスの開発者の1人でない限り、知ることは困難です。
最初に知っておく必要があるのは、のHashSet
ように機能することです。つまりSet
、オブジェクトをに直接追加し、HashSet
重複を含めることはできません。に直接値を追加するだけHashSet
です。
しかし、HashMap
あるMap
タイプ。つまり、エントリを追加するたびに、キーと値のペアを追加します。
ではHashMap
、重複する値を持つことはできますが、重複するキーを持つことはできません。でHashMap
新しいエントリ古いものに置き換えられます。最新のエントリはにありHashMap
ます。
HashMapとHashSetの間のリンクを理解する:
覚えておいてください、HashMap
重複キーを持つことはできません。舞台裏ではをHashSet
使用していHashMap
ます。
オブジェクトをに追加しようとするとHashSet
、このエントリは実際にはキーとして格納されますHashMap
-のHashMap
背後で使用されるものと同じですHashSet
。この基盤HashMap
にはキーと値のペアが必要なので、ダミーの値が生成されます。
同じに別の複製オブジェクトを挿入しようとするとHashSet
、HashMap
その下にあるオブジェクトのキーとして再度挿入しようとします。ただし、HashMap
重複はサポートされていません。したがって、HashSet
そのタイプの値は1つだけになります。補足として、重複するすべてのキーについて、HashSetのエントリに対して生成された値はランダム/ダミーの値であるため、キーはまったく置き換えられません。キーを削除して同じキー(ダミー値は同じ)を追加し直すことはまったく意味がないため、無視されます。
概要:
HashMap
複製values
は許可しますが、許可しませんkeys
。
HashSet
重複を含めることはできません。
オブジェクトの追加が正常に完了しているかどうかを再生するには、次のことが確認できboolean
た値は、あなたが呼び出すときに返され.add()
、それが返すかどうtrue
かfalse
。返された場合はtrue
、挿入されました。
HashMap allows duplicate values
HashMapは古い値を新しい値に置き換えます。
ドキュメントは、この上のかなりはっきりしている:HashSet.add
いない置き換えます。
指定された要素がまだ存在しない場合は、このセットに追加します。より正式には、このセットに要素e2が含まれていない場合、指定された要素eをこのセットに追加します(e == null?e2 == null:e.equals(e2))。このセットにすでに要素が含まれている場合、呼び出しはセットを変更せずにfalseを返します。
しかします置き換えます。HashMap.put
マップに以前にキーのマッピングが含まれていた場合、古い値が置き換えられます。
それはHashSetの場合、それを置き換えません。
ドキュメントから:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E)
「指定された要素がまだ存在しない場合、このセットに追加します。より正式には、このセットに要素e2が含まれていない場合、指定された要素eをこのセットに追加します(e == null?e2 == null:e.equals( e2))このセットにすでに要素が含まれている場合、呼び出しはセットを変更せずにfalseを返します。
HashSetはHashMapによってバックアップされるため、最初にHashマップのputメソッドを確認する必要があります
HashMap
基本的にはEntry
を含みKey(Object)
、その後を含み、Value(Object)
.InternallyでHashSet
ありHashMap
、HashMap
すでに指摘したように値を置き換えますが、実際にはキーを置き換えますか??? No ..これがここでのトリックです HashMap
その値を基になるキーとして保持しHashMap
、値は単なるダミーオブジェクトであるため、同じ値をHashMap(基になるマップのキー)に再挿入しようとすると、ダミーの値が置き換えられ、Key(Value for HashSet)は置き換えられません。
以下のHashSetクラスのコードを見てください。
public boolean [More ...] add(E e) {
return map.put(e, PRESENT)==null;
}
ここでeはHashSetの値ですが、基になるマップのキーです。キーは置き換えられません。混乱を解消できるといいのですが。
HashMap
かどうかを確認するためにkey
、すでに呼び出す前に存在しているput
裏にmap
?