私の最初の本能は、各キーがオブジェクトであり、重複が挿入されているかどうかを判断するために使用されるハッシュコードを持っていると言うことです。しかし、私はそれを確実に裏付けるものを見つけることができません。誰かがそれを言っているリンクを提供したり、ここで本当の答えを提供したりできますか? ありがとう!
5 に答える
Map
インターフェイスは、2 つのキーが である場合はnull
重複し、それ以外の場合は重複k
があることを指定しますkey.equals(k)
。ここで、contains または get メソッドを参照してください。
http://java.sun.com/javase/6/docs/api/java/util/Map.html#containsKey(java.lang.Object)
ただし、Map
そのチェックを実行する方法は実装次第であり、ハッシュ コードを使用して、メソッドHashMap
でチェックする潜在的なキーを絞り込みます。equals
したがって、実際には、典型的なハッシュベースのマップの場合、重複をチェックするために、マップはハッシュコード (おそらく mod 一部のサイズ) を取得しequals
、同じサイズのハッシュコード mod が同じ剰余を与えるキーと比較するために使用します。
質問を間違って読んでください。しかし、上記の人の答えは正しいです。私のリンクは、それがどのように決定されるか (equals メソッド) に関する答えを提供します。リンクのcontainsメソッドとgetメソッドを見てください。
マップの挿入方法: マップに重複するキーはありません。重複するキーが見つかった場合は、古い値が新しい値に置き換えられます。Map インターフェイスへのリンクは次のとおりです。また、 put(K key, V value) メソッドを見れば、マップの仕組みも説明されています。それが役立つことを願っています。
java.util.Map
標準 Java ライブラリで提供されるインターフェイスである を参照していると仮定しています。キーが重複しているかどうかを判断する方法は、特定の実装に任されています。たとえば、Ajava.util.HashMap
はequals
とを使用します。hashCode
まったく異なるものを使用する Map の独自の実装を作成できます。
ここでエッジケースに注意してください。ヌルキーは常に重複しているわけではありません。実際、nullキーは、Mapの実装間で多くのフラストレーションを引き起こすことが判明しています(一貫性に関する私の投稿を参照してください)。
たとえば、nullキーはHashMapsでは問題ありませんが、自然な順序を使用するTreeMapや、nullキーが禁止されているConccurentHashMapでは問題ありません。ここでの問題は、nullキーを使用すると、多くのメソッドでキャッチされない例外がスローされることと、リファクタリング中に実装を切り替えるときに恐ろしい実行時のバグが発生することです。
キーに対して equals() メソッドを使用します。hashCode() メソッドは、マップのキーを効率的に格納するのに役立ちます。