2011-08-15 29 views
2

爲什麼Java中的對象的哈希碼更改?它是否改變了? 它與Hashtable有什麼關係? 每個對象都應該有它獨特的hashcode。所以,重新引用它的原因是什麼?爲什麼Java中的對象的哈希碼更改?

在此先感謝。

+2

它什麼時候改變? –

+0

你有一個它如何改變的例子嗎? – Marcelo

+0

也許你應該讀這個:http://stackoverflow.com/questions/6051960/how-to-write-a-good-hashcode-for-permutations和這個:http://stackoverflow.com/questions/1990734/hashcode等於 – panzerschreck

回答

2

默認哈希碼的實現等同於對象標識。但是,一些對象覆蓋散列碼,這可能會給你一個根據對象狀態而改變的散列碼。

通常,如果您覆蓋equals的定義(實際上,如果您覆蓋等於您應該覆蓋散列碼),則會執行此操作。這是因爲您希望通過您創建的任何定義來相等的對象返回相同的哈希碼。否則,你可能會遇到這樣的情況:映射包含多個「相等」對象,因爲它們返回不同的哈希碼。

+2

或者更糟糕的是,對象的哈希碼在地圖中發生更改,並且您失去了外部參照。取回它的唯一方法是迭代地圖,並在您的標準上進行平等。 – corsiKa

+1

這真是一個非常不愉快的想法 - 我從不擔心這種特殊的可能性,但現在我會。優秀的名字,順便說一句。 –