2009-12-13 33 views
3

我曾經見過,只有String被用作HashMap中的一個鍵。雖然put()方法以Object作爲參數,但它的重要性如何。如果任何其他對象也可以使用作爲一個關鍵或不? 請提供答案。字符串作爲HashMap中的一個鍵

+1

@Michael你怎麼知道這是一個Java問題? – 2009-12-13 11:02:22

+4

你知道任何其他語言有'HashMap'類和'put()'方法,它需要Object作爲參數嗎? – BalusC 2009-12-14 17:44:11

回答

0

你還沒有顯示出你正在談論的平臺,但我現在假設它是Java。

您可以在HashMap中使用任何類型的密鑰,但假設您使用完整的通用版本,則需要指定該類型並將其一致使用。例如,你可以使用URI作爲鍵類型:

HashMap<URI, Integer> hitCountMap = new HashMap<URI, Integer>(); 

get方法需要對象作爲關鍵參數類型,當然你應該使用相同類型的鍵,你已經投入的地圖。請參閱this question以獲得更多關於此的討論。

+5

URL可能是哈希映射中鍵的一個不好的例子。從文檔中,哈希代碼基於與URL比較相關的所有URL組件。這很慢(因爲它涉及到針對名稱服務器解析URL),因此使用URI可能會更好。 當然,這是完全拋開這個問題! – 2009-12-13 10:52:04

+0

謝謝 - 將修復URI :) – 2009-12-13 11:28:50

8

提供hashCode()的有意義實現的任何對象都是地圖中的完美關鍵候選者:請參閱Understanding the workings of equals and hashCode in a HashMap

另外,正如@Jon提到的,地圖中的所有鍵都應該是相同的類型。

編輯:當然,你需要實現equals()hashcode()。我認爲與其他問題鏈接的標題清楚地表明瞭這一點。但是一個愚蠢的執行hashcode()只會帶給你一個退化的HashMap,表現很差。

EDIT2:正如@Adrian在他的回答中提到的,泛型將幫助您約束地圖的鍵和值的類型。

參考文獻:

+0

當然,如果你重寫hashCode(),你也必須重寫equals(),否則你的哈希映射可能會做一些奇怪的事情。 – Ash 2009-12-13 11:04:24

+0

不可以,只有一個實現了** equals **和hash(或者兩者都不)的對象應該被用作關鍵字。 – akuhn 2009-12-13 11:14:26

+0

@Adrian>它被暗示爲我連接到另一個答案...然而,實現equals和hashcode與轉儲哈希碼實現將帶給你無處... – 2009-12-13 11:17:16

6

原始HashMap確實會接受任何對象作爲重點。然而,良好的作風,以指定你要哪種鍵和值的地圖

Map<String, Whatever> map = new HashMap<String, Whatever>(); 

使用,如果你這樣做,put()方法將只接受字符串。

 

NB:如果您選擇使用自己的類中的一個作爲密鑰,確保類要麼實現既equalshashCode或沒有人!

0

鍵類型可以是任何類型,包括(對於某些用例)對象。唯一的技術要求是equals(Object)hashcode()已正確實施所有類的實例可能被用作關鍵。實際上,您還希望的語義equals(Object)與所有可能的鍵類型/值的HashMap的預期行爲一致。

但是,如果您確實需要使用Object作爲鍵類型,那麼IdentityHashMap可能是更好的選擇。首先,它不使用equals(Object)hashcode(),但使用==和密鑰對象的「身份散列」值。

3

爲什麼你看到「String」經常用作散列鍵的一個可能原因是它是一個不可變的類

不可變對象作出巨大映射鍵,因爲一個不用擔心他們的價值觀
一旦他們在地圖中被修改或設置,這將破壞
地圖或設定的invaraints(第15項有效的Java,第二版)

+0

此外,字符串有等於()內置 – 2014-10-21 23:13:01

1

我們一般在HashMap中使用String作爲鍵的原因之一是,由於String在Java中是不可變的,允許String緩存其哈希碼,因此不可變Java中的String緩存哈希碼,並且不會每次計算調用String的hashcode方法,這使得它像HashMap鍵一樣快。

+0

是,但只有當我們使用相同的String實例再次訪問HashMap時,這不是因爲hashCode(),而是因爲equals()將兩個字符串的O(字符串的長度)時間相同,而不是同一個實例。 – kutschkem 2013-07-17 08:04:35

相關問題