根據this blog entry,HashMap在已經檢索到的哈希碼上重新調用了自己的實現hashCode()
(稱爲hash()
)。HashMap爲什麼以及如何將自己的hashCode()的內部實現稱爲hash()?
如果密鑰不爲空的話,它將調用密鑰對象上散列函數,見線4在上述方法中,即key.hashCode(),所以key.hashCode()返回散列值之後,第4行看起來像
INT哈希散列=(散列值)
,現在,它適用返回散列值到它自己的散列函數。
我們可能想知道爲什麼我們使用散列(hashValue)再次計算散列值。答案是,它防範低質量hash>函數。
Can HashMap 準確重新分配hashcode? HashMap可以存儲對象,但它無法訪問爲其對象分配hashCode的邏輯。例如,hash()
不可能的邏輯集成以下hashCode()
實現背後:
public class Employee {
protected long employeeId;
protected String firstName;
protected String lastName;
public int hashCode(){
return (int) employeeId;
}
}
的可能的複製[認識奇怪的Java哈希函數(http://stackoverflow.com/questions/9335169/understanding-strange-java-hash-function) – Nayuki
@NayukiMinase猜猜散列'()的實現'隨着時間的推移已經發生了變化,因爲1.8.0_51版本不同/更簡單(參見我的答案)。 – Andreas