以下のコードを検討してください。
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
HashSet
重複を許可しないため1を与えるため、1つの要素のみが格納されます。
重複する要素を追加するのか、それとも前の要素を置き換えるのか、それとも単に追加しないのかを知りたいのですが。
HashMap
また、同じ場合に使用するとどうなりますか?
以下のコードを検討してください。
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
HashSet
重複を許可しないため1を与えるため、1つの要素のみが格納されます。
重複する要素を追加するのか、それとも前の要素を置き換えるのか、それとも単に追加しないのかを知りたいのですが。
HashMap
また、同じ場合に使用するとどうなりますか?
最初に知っておく必要があるのは、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
た場合は挿入されました。
ドキュメントはこれについてかなり明確です:置き換えHashSet.add
ません:
指定された要素がまだ存在しない場合は、このセットに追加します。より正式には、このセットに(e == null?e2 == null:e.equals(e2))のような要素e2が含まれていない場合、指定された要素eをこのセットに追加します。このセットにすでに要素が含まれている場合、呼び出しはセットを変更せずに残し、falseを返します。
しかし、置き換えられます:HashMap.put
マップに以前にキーのマッピングが含まれていた場合、古い値が置き換えられます。
HashSetの場合、それを置き換えるものではありません。
ドキュメントから:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E)
"指定された要素がまだ存在しない場合は、このセットに追加します。より正式には、このセットに(e == null?e2 == null:e.equals( e2))。このセットにすでに要素が含まれている場合、呼び出しはセットを変更せずに残し、falseを返します。」
私が間違っている場合は訂正してください。ただし、文字列を使用すると、「Hi」==「Hi」が常に真になるとは限りません(必ずしも同じオブジェクトではないため)。
ただし、1の答えが得られる理由は、JVMが可能な場合は文字列オブジェクトを再利用するためです。この場合、JVMは文字列オブジェクトを再利用しているため、Hashmap/Hashsetの項目を上書きします。
ただし、この動作は保証されていません(同じ値「Hi」を持つ別の文字列オブジェクトである可能性があるため)。表示される動作は、JVMの最適化によるものです。
HashMap
基本的には、を含み、Entry
その後に含まれます。内部的には、すでに指摘したように値を置き換えます。しかし、実際にはキーを置き換えますか?いいえ..これがここでのトリックです。その値を基になるキーとして保持し、値は単なるダミーオブジェクトです。したがって、同じ値をHashMap(基になるマップのキー)に再挿入しようとすると、Key(HashSetの値)ではなくダミー値が置き換えられます。Key(Object)
Value(Object)
HashSet
HashMap
HashMap
HashMap
HashMap
HashSetクラスの以下のコードを見てください。
public boolean [More ...] add(E e) {
return map.put(e, PRESENT)==null;
}
ここで、eはHashSetの値ですが、基になるmap.andキーのキーは置き換えられません。私が混乱を解消できることを願っています。
HashSetはHashMapによってバックアップされるため、最初にHashマップのputメソッドを確認する必要があります。
別の言い方をすれば、キーがすでに存在するHashMapにキーと値のペアを挿入すると(ある意味でhashvalue()は同じ値を与え、equal()はtrueですが、2つのオブジェクトはいくつかの点で異なる可能性があります) )、キーは置き換えられませんが、値は上書きされます。キーは、hashvalue()を取得し、それを使用してテーブル内の値を見つけるために使用されます。HashSetはHashMapのキーを使用し、(ユーザーにとって)実際には重要ではない任意の値を設定するため、結果としてセットの要素も置き換えられません。