this blog entryによると、HashMapはすでに検索したハッシュコードに対してhashCode()
という独自の実装(hash()
)を再表示します。キーがNULLでない場合key.hashCodeは()ハッシュ値を返した後、4行目はHashMapにはhash()という独自のhashCode()が実装されています。
、それは、上記の方法すなわちkey.hashCode()でライン4を参照して、キーオブジェクトにハッシュ関数を呼び出します
int hash = hash(hashValue)
これで、返されたhashValueが独自のハッシュ関数に適用されます。
ハッシュ値(ハッシュ値)を使用してハッシュ値を再度計算する理由が不思議に思うかもしれません。答えは、それは劣悪な品質のハッシュ関数を守ることです。
HashMap 正確にハッシュコードを再割り当てできますか? HashMapはオブジェクトを格納できますが、そのオブジェクトにhashCodeを割り当てるロジックにはアクセスできません。たとえば、hash()
は、おそらく以下hashCode()
実装の背後にあるロジックを統合することができませんでした:hash()
実際のハッシュコードから「改善」のハッシュコードを導出
public class Employee {
protected long employeeId;
protected String firstName;
protected String lastName;
public int hashCode(){
return (int) employeeId;
}
}
可能な複製(http://stackoverflow.com/questions/9335169/understanding-strange-java-hash-function) – Nayuki
は(ハッシュ 'の実装を推測@NayukiMinase)' 1.8.0_51バージョンが異なる/よりシンプルであるため、時間の経過と共に変化しました(私の答えを見てください)。 – Andreas