2016-10-14 5 views
5

以下はJava 7のHashMap実装のソースコードです(get()メソッド)。ご覧のように、getメソッドでは、キーを比較するときに、キーの「ハッシュコードとキー」の値を比較して、リンクされたリスト内の項目がキーを検索するかどうかを判断します。しかし、2つのキーが同じであれば、もちろん同じハッシュコードを持ち、2つのキーが異なる場合、キーの値を比較するだけでそれらを区別することができます。では、なぜJavaのHashMapソースコードがキーのハッシュコードの同等性を気にしているのですか?hashmapキーの比較、キーのハッシュコードとキーの値の両方を比較する理由

public V get(Object key) { 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

答えて

8

==int平等のためのテストは、複雑なオブジェクト上equalsを呼び出すに比べてかなり安い操作です。ハッシュの平等は簡単なことです。キーがまったく存在しない場合、ハッシュは等しくなく、falseを返す比較的速い==は、(短絡ロジックのおかげで)高価なequalsの演算の実行を節約します。鍵があれば、別の素早い平等を「無駄にした」だけです。

関連する問題