2013-03-27 116 views
3

散列映射和散列表中的鍵類型是否存在約束?----訪問問題。 我認爲是的,我們可以根據需要進行定製。散列映射數據類型是否有任何約束

+2

必須實現'hashCode()'和'equals()'有意義。 – jlordo 2013-03-27 01:02:50

+3

鍵應該是不可變的,否則會遇到奇怪的問題。 – 2013-03-27 01:04:35

回答

2

從技術上講,沒有。通常,您想要使用實現equals()和hashCode()的對象,儘管這不是必需的。如果你不這樣做,那麼它將使用Object定義的基類實現來比較對象標識。很多時候,這是不恰當的,但有時候很好。

從技術上講,只要equals()和hashCode()實現中使用的值是不可變的,密鑰不需要是不可變的。例如,如果您的Foo類使用字符串「foo」作爲它的一部分,那麼該值「foo」不得更改。這是因爲哈希映射出於效率原因將密鑰放入基於hashCode()值的桶中。如果hashCode突然變化,那麼散列圖就不知道了,而且鍵將存在於錯誤的桶中,並且會遇到令人討厭的bug,因爲這樣就有可能在地圖中存在「重複」對象。希望這是有道理的。

1

幾件事情要考慮:

  1. 只是對「類型」,則無法使用基本類型。這是Java的語言約束。例如HashMap<int, Foo>是無效的,你需要使用HashMap<Integer, Foo>

  2. 基礎上的方式HashMap的工作,關鍵要有一個有意義實現的hashCode()和equals()的。它是如何「有意義」取決於你的需要。 Object中的默認實現可能已經滿足您的需求,但您需要了解它。

  3. 一旦一個對象實例放入Map中作爲鍵,它的hashCode()和equals()應該保持一致。您不應該放入地圖,並將對象實例的狀態更改爲Key,並使hashCode()/ equals()返回不同的值。確保它最簡單的方法當然是使用不可變對象作爲關鍵。但是,使用可變對象仍然很好,但在代碼中,確保不會改變鍵的狀態。